http://developerworks.github.io/2011/05/16/erlang-use-log4erl/

Erlang 使用Log4erl

all = debug < info < warn < error < fatal < none

更新历史:

  • 2014-09-25 23:34:31

功能

  • 支持多日志
  • 当前文件Appender仅支持基于大小的日志文件滚动
  • 支持默认Logger,未指定Logger时系统提供默认Logger
  • 5个预定义的日志级别(debug, info, warn, error, fatal)
  • 一个error_logger的日志处理器
  • 支持用户指定日志级别
  • 支持日志格式化
  • 支持控制台日志
  • 支持smtp formatter
  • 支持XML格式的日志
  • 支持syslog
  • 支持在运行时改变Appender的格式和级别.

Step1. Checkout from repository

你可以从 -Google code 或者- Github上获取Log4erl的源代码, Google code上的代码已经旧了,建议从Github上clone 代码

1
git clone git://github.com/ahmednawras/log4erl.git log4erl

Clone a copy from github
Checkout a copy from google code
Log4erl目录结构
编译Log4erl

Step2. 编译

如图4, 进入Log4erl源代码目录src执行:

1
make:all([{outdir, "../ebin"}]).

Step3. 安装

你要让Erlang能够找到Log4erl,两种方式

  1. 把整个Log4erl目录复制到$ERLANG_HOME/lib目录下面.看上面第三张图.
  2. 命令行指定
1
erl -pz /path/to/log4erl

Step4. 使用

1
application:start(log4erl).

创建配置文件并调用log4erl:conf(file)初始化

1
log4erl:conf("priv/log4erl.conf").

同样你可以用编程的方式对Log4erl进行配置

1
2
log4erl:add_logger(messages_log).
log4erl:add_console_appender(messages_log, cmd_logs, {warn, "[%L] %l%n"}).

好了,现在可以使用它了.

1
log4erl:info("Information message").

Log4erl配置文件格式

1
2
3
logger [<name>] {
...
}

<name> 指定了Logger的名称,你可以去任意你喜欢的名字.如果不指定任何名字,那么log4erl将把它作为默认的Logger使用,例如:

1
2
3
4
%% default logger
logger {
...
}

在一个Logger中,可以有一到多个Appender,例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
%% Default logger
%% it includes a file appender and a console appender
logger{
file_appender app2{
dir = ".",
level = info,
file = my_app,
type = size,
max = 100000,
suffix = log,
rotation = 5,
format = '[%L] %I %l%n'
}
console_appender app1{
level = warn,
format = '%T %j [%L] %l%n'
}
}

Appender的配置格式如下

1
2
3
<appender_type> <name> {
...
}

在Appender中你可以用’property=value’的格式来设置Appender的属性,属性剑以’,’逗号分隔.每种Appender有不同的属性集合.

公共属性:

1
2
level   = <Level>     => 日志级别 (例如: warn)
format = <F> => 输出格式 (查看 'Appenders.txt')

file_appender

1
2
3
4
5
6
dir         => 输出路径 (例如: /var/log/my_app)
file => 日志文件名称 (例如: my_app_log)
type => size,time. 当前仅实现了基于size的日志滚动
max => 每次日志滚动的最大文件大小
suffix => 日志文件后缀 (例如: log)
rotation => 循环滚动次数,例如为5, 当滚动到第五个日志文件并且日志文件达到指定size的时候就会覆盖前面的日志文件,依次循环

smtp_appender

1
2
3
4
5
6
7
8
9
ip          => SMTP服务器IP地址
port => SMTP服务器端口
no_auth
username => 用户名
password => 密码
from => 寄信人地址
to => 收信人地址
tilte => 邮件标题
msg => 邮件内容

syslog_appender

1
2
3
facility => Facility (例如: ftp)
host => 发送syslog消息的目标主机 [可选]
port => syslog 端口[可选]

新建一个测试项目test
新建module,test_log,代码如下

-module(test_log).
-export([init/0,log/0]).
init()->
init_log4erl(). log()->
log4erl:warn("warn3 msg"). init_log4erl() ->
application:start(log4erl),
log4erl:add_file_appender(app,{"/ide/erlang/workspace/log", "app", {size, 100000}, 10, log, info}),
log4erl:change_format(app, "%j %T [%L] %l%n"),
log4erl:add_console_appender(cmd_logs, {info, "%j %T [%L] %l%n"}).

log格式的配置,可以参看log4erl自带的README.txt,和API.txt

验证
1)启动 test_log:init().
2)使用 test_log:log().
结果:
2012-05-30 13:57:02.180647 [error] check_pid_is_alive error!

本文源码:

https://github.com/developerworks/skypebot/tree/master/src/erlang/log4erl_example

参考资料:

  1. http://code.google.com/p/log4erl/wiki/Conf_Getting_Started
  2. http://code.google.com/p/log4erl/wiki/Log4erl_Manual_2

Log4erl的更多相关文章

  1. log4erl API

    https://github.com/ahmednawras/log4erl/blob/master/API.txt NOTE:=====Please be informed that the API ...

  2. log4erl Configuration

    https://github.com/ahmednawras/log4erl/blob/master/CONFIGURATION.txt Configuration Guide: ========== ...

  3. high volume logging

    logging 是现在系统中必不可少的组件了.市面上已经有很多很多非常成熟的日志产品,log*系列就是一个典型代表.对于erlang系统来说,也有很多,比如error_logger, disk_log ...

  4. erlang中http请求

    1..app文件中 {application,backend,[  {description,"ebank backend"},  {vsn,1.0},  {modules,[]} ...

  5. 理解Erlang/OTP Supervisor

    http://www.cnblogs.com/me-sa/archive/2012/01/10/erlang0030.html Supervisors are used to build an hie ...

  6. 理解Erlang/OTP - Application

    http://www.cnblogs.com/me-sa/archive/2011/12/27/erlang0025.html 1>application:start(log4erl). 我们就 ...

  7. 建立一个OTP应用

    http://www.javaeye.com/topic/374167 以下是在erlang项目开发中的一些记录,即包含很多通俗易懂的原则,也包含一些似是而非的建议,比较混乱,还没有积累到一个可以分门 ...

  8. erlang 开发建议

    * 确保没有任何编译警告 * Erlang中String采用list实现,32位系统中,其1个字符用8个字节的空间(4个保存value, 4个保存指针).因此string速度较慢,空间占用较大 * 在 ...

随机推荐

  1. Solr 写数据流程

    Solr 写数据流程: 1.源字符串首先经过分词器处理,包括:拆分词以及去除stopword. 2.然后经过语言处理,包括大小写转换以及单词转换. 3.将源数据中需要的信息加入到Document中的各 ...

  2. synchronized和AtomicInteger解决并发问题的性能比较

    AtomicInteger,一个提供原子操作的Integer的类.在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字.而volatile ...

  3. 2018VMware虚拟机安装Mac OS 10.12.1

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一.下载安装中所需的镜像文件以及补丁工具 Mac OS 10.12.1 Sierra (16B2555) 懒人版(下载地址):ht ...

  4. Loadrunner--运行场景报Socket descriptor not found错误

    今天早上在使用LoadRunner时,报了如下的错误,开始并未看错误以为是录制问题引起,就重新录制了一遍,简单施压看看错误是否还有,结果错误仍然有,如下所示: Error: Socket descri ...

  5. 使用Surging Mqtt 开发基于WS的MqttClient客户端

    原文:使用Surging Mqtt 开发基于WS的MqttClient客户端 最近一段时间由于要做一套智能设备系统,而有幸了解到Surging中的Mqtt broker,学习了很多东西本篇文章基于Su ...

  6. Android 自己定义主菜单

    本文介绍一个超简单的自己定义主菜单.效果例如以下: 原理:事实上就是对原生的Dialog的一个简单的封装.并加上显示和隐藏的动画效果.再给控件加上回调事件. TestDialog.java publi ...

  7. 第三方插件将数据转成json

    1.需要使用第三方jar commons-beanutils-1.7.0.jar /commons-collections-3.1.jar/commons-lang-2.5jar /commons-l ...

  8. ssi的使用 开启 配置等

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lsfhack/article/details/69664402ssi的定义SSI(Server Si ...

  9. zoj 2724 Windows Message Queue 优先队列

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1724 题目大意: 给出两种操作,GET要求取出当前队首的元素,而PUT会输入名 ...

  10. finish() OnDestroy() system.exit()

    1 finish()方法:activity动作完成的时候, 或者Activity需要关闭的时候, 调用此方法. 2 当你调用此方法的时候,系统只是将最上面的Activity移出了栈,并没有及时的调用o ...