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. Ubuntu配置图形桌面LXDE和VNC、中文语言包、中文输入法

    Ubuntu配置图形桌面LXDE和VNC.中文语言包.中文输入法 http://www.lijiejie.com/ubuntu-vps-config-lxde-vnc/ LXDE是Ubuntu图形桌面 ...

  2. bootstrap课程8 bootstrap导航条在不同设备上的显示效果如何

    bootstrap课程8 bootstrap导航条在不同设备上的显示效果如何(多去看参考手册) 一.总结 一句话总结:在手机端或者平板端或者显示不够的话就缩起来了.(多去看参考手册) 二.bootst ...

  3. 语音识别系统:有免费实用的"语音到文字"的软件么?

    自从看了<李开复自传>,就对"语音识别系统"产生了非常深刻的印象. 根据自己的判断,语音识别系统还是非常有用的. 以自己的实际需求来看: 1.中国象棋中的应用. 中国象 ...

  4. PatentTips - Maintaining shadow page tables in a sequestered memory region

    BACKGROUND Malicious code, known as malware, which includes viruses, worms, adware, etc., may attack ...

  5. asp.net mvc 中的自定义验证(Custom Validation Attribute)

    前言

  6. 在react底下安装环境

    1.在react底下安装环境 Image.png Image.png 2.新建一个文件夹 Image.png 3.配置入口文件redux:staticRoot+'/redux/app' Image.p ...

  7. 【Codeforces Round #442 (Div. 2) B】Nikita and string

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举中间那一段从哪里开始.哪里结束就好 注意为空的话,就全是a. 用前缀和优化一下. [代码] #include <bits/ ...

  8. xml 标准字符过滤

    今天在代码里面看见一串非常奇怪的推断语句 if (c < 0x9 || c > 0x9 && c < 0xA || c > 0xA && c & ...

  9. C_C++指针指针应用详解

    前言:复杂类型说明 要了解指针,多多少少会出现一些比较复杂的类型,所以我先介绍一下如何完全理解一个复杂类型,要理解复杂类型其实很简单,一个类型里会出现很多运算符,他们也像普通的表达式一样,有优先级,其 ...

  10. $_SERVER['DOCUMENT_ROOT']

    $_SERVER['DOCUMENT_ROOT'] 一.总结 $_SERVER 是一个包含了诸如头信息(header).路径(path).以及脚本位置(script locations)等等信息的数组 ...