文档章节

Log4j配置文件详解

陶邦仁
 陶邦仁
发布于 2015/10/10 14:32
字数 4751
阅读 3957
收藏 13

Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。

#0 系列目录#

#1 Properties配置文件#

Log4J配置文件的基本格式如下:

#配置根Logger
log4j.rootLogger  =   [ level ]   ,  appenderName1 ,  appenderName2 ,  …

#配置日志信息输出目的地Appender
log4j.appender.appenderName  =  fully.qualified.name.of.appender.class 
log4j.appender.appenderName.option1  =  value1 
… 
log4j.appender.appenderName.optionN  =  valueN 

#配置日志信息的格式(布局)
log4j.appender.appenderName.layout  =  fully.qualified.name.of.layout.class 
log4j.appender.appenderName.layout.option1  =  value1 
… 
log4j.appender.appenderName.layout.optionN  =  valueN 

其中 [level] 是日志输出级别,共有5级:

FATAL       0  记录影响系统正常运行,可能导致系统崩溃的事件
ERROR       3  记录影响业务流程正常进行,导致业务流程提前终止的事件
WARN        4  记录未预料到,可能导致业务流程无法进行的事件
INFO        6  记录系统启动/停止,模块加载/卸载之类事件
DEBUG       7  记录业务详细流程,用户鉴权/业务流程选择/数据存取事件
TRACE          记录系统进出消息,码流信息

Appender 为日志输出目的地,Log4j提供的appender有以下几种:

org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

Layout:日志输出格式,Log4j提供的layout有以下几种:

org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

打印参数: Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,如下:

%m   输出代码中指定的消息
%p   输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL 
%r   输出自应用启动到输出该log信息耗费的毫秒数 
%c   输出所属的类目,通常就是所在类的全名 
%t   输出产生该日志事件的线程名 
%n   输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n” 
%d   输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss , SSS},输出类似:2002年10月18日  22 : 10 : 28 , 921  
%l   输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java: 10 ) 

日志记录规则:

1.必须是含义明确的完整语句

推荐格式1:主语 + 谓语 log.info(“The system is in primary state”);

推荐格式2:动名词 + 宾语 log.debug(“Saving the user information into the database”);

2.推荐记录业务流程消息

在业务流程开始和业务流程结束时打印接收和发送出的消息内容,严禁在内部函数内多次打印消息内容;

3.推荐记录函数关键参数,关键数据结构

4.推荐记录导致业务错误的异常栈空间

5.不推荐记录函数出入口

6.不推荐记录行号

#2 在代码中初始化Logger# 1)在程序中调用BasicConfigurator.configure()方法:给根记录器增加一个ConsoleAppender,输出格式通过PatternLayout设为"%-4r [%t] %-5p %c %x - %m%n",还有根记录器的默认级别是Level.DEBUG.

2)配置放在文件里,通过命令行参数传递文件名字,通过PropertyConfigurator.configure(args[x])解析并配置;

3)配置放在文件里,通过环境变量传递文件名等信息,利用log4j默认的初始化过程解析并配置;

4)配置放在文件里,通过应用服务器配置传递文件名等信息,利用一个特殊的servlet来完成配置。

#3 为不同的Appender设置日志输出级别# 当调试系统时,我们往往注意的只是异常级别的日志输出,但是通常所有级别的输出都是放在一个文件里的,如果日志输出的级别是DEBUG!?那就慢慢去找吧。

这时我们也许会想要是能把异常信息单独输出到一个文件里该多好啊。当然可以,Log4j已经提供了这样的功能,我们只需要在配置中修改Appender的Threshold 就能实现,比如下面的例子:

### set log levels ###
log4j.rootLogger = debug ,  stdout ,  D ,  E

### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =  %d{ABSOLUTE} %5p %c{ 1 }:%L - %m%n

### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG ## 输出DEBUG级别以上的日志
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 保存异常信息到单独文件 ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = logs/error.log ## 异常日志文件名
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

[代码中使用]:

public class TestLog4j {
    public static void main(String[] args) {
        PropertyConfigurator.configure("D:/Code/conf/log4j.properties");
        Logger logger = Logger.getLogger(TestLog4j.class);
        logger.debug("debug");
        logger.error("error");
    }
}

log4j中log.isDebugEnabled(), log.isInfoEnabled()和log.isTraceEnabled()作用,项目在应用log4j打印Debug,Info和Trace级别的log时需要加上对应的三个方法进行过滤,代码如下:


if (log.isDebugEnabled()) {
    log.debug(" From: " + req.getFrom().toString() + " To: " + req.getTo().toString() + " CallId: " +  req.getCallId() + " msg:" + msg);
}

其作用是因为Debug,Info和Trace一般会打印比较详细的信息,而且打印的次数较多,如果我们不加log.isDebugEnabled()等进行预先判断,当系统loglevel设置高于Debug或Info或Trace时,虽然系统不会答应出这些级别的日志,但是每次还是会拼接参数字符串,影响系统的性能。

#4 配置文件示例#

log4j.rootLogger=DEBUG,A1,R
#log4j.rootLogger=INFO,A1,R

# ConsoleAppender 输出
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss,SSS} [%c]-[%p] %m%n

# File 输出 一天一个文件,输出路径可以定制,一般在根路径下
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.File=blog_log.txt
log4j.appender.R.MaxFileSize=500KB
log4j.appender.R.MaxBackupIndex=10
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} [%t] [%c] [%p] - %m%n

# 文件配置Sample2
# 下面给出的Log4J配置文件实现了输出到控制台,文件,回滚文件,发送日志邮件,输出到数据库日志表,自定义标签等全套功能。
log4j.rootLogger=DEBUG,CONSOLE,A1,im 
#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
log4j.addivity.org.apache=true

################### 
# Console Appender 
################### 
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.Threshold=DEBUG 
log4j.appender.CONSOLE.Target=System.out 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n

##################### 
# File Appender 
##################### 
log4j.appender.FILE=org.apache.log4j.FileAppender 
log4j.appender.FILE.File=file.log 
log4j.appender.FILE.Append=false 
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout 
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n 
# Use this layout for LogFactor 5 analysis

######################## 
# Rolling File 
######################## 
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender 
log4j.appender.ROLLING_FILE.Threshold=ERROR 
log4j.appender.ROLLING_FILE.File=rolling.log 
log4j.appender.ROLLING_FILE.Append=true 
log4j.appender.ROLLING_FILE.MaxFileSize=10KB 
log4j.appender.ROLLING_FILE.MaxBackupIndex=1 
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout 
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

#################### 
# Socket Appender 
#################### 
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender 
log4j.appender.SOCKET.RemoteHost=localhost 
log4j.appender.SOCKET.Port=5001 
log4j.appender.SOCKET.LocationInfo=true 
# Set up for Log Facter 5 
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout 
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n

######################## 
# Log Factor 5 Appender 
######################## 
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender 
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000

######################## 
# SMTP Appender 
####################### 
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender 
log4j.appender.MAIL.Threshold=FATAL 
log4j.appender.MAIL.BufferSize=10 
log4j.appender.MAIL.From=chenyl@yeqiangwei.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com 
log4j.appender.MAIL.Subject=Log4J Message 
log4j.appender.MAIL.To=chenyl@yeqiangwei.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout 
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

######################## 
# JDBC Appender 
####################### 
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender 
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test 
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver 
log4j.appender.DATABASE.user=root 
log4j.appender.DATABASE.password= 
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n') 
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout 
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.A1.File=SampleMessages.log4j 
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' 
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout

################### 
#自定义Appender 
################### 
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net 
log4j.appender.im.username = username 
log4j.appender.im.password = password 
log4j.appender.im.recipient = corlin@yeqiangwei.com
log4j.appender.im.layout=org.apache.log4j.PatternLayout 
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

#5 XML配置文件示例#

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <!--
        ConsoleAppender : 输出至控制台
        选项:
            Threshold=WARN:指定日志消息的输出最低层次。
            ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
            Target=System.err:默认情况下是:System.out,指定输出控制台。
    -->
    <appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
        <!-- PatternLayout : 控制日志输出格式 -->
        <!--
            Log4j提供的layout有以下4种:
                1. org.apache.log4j.HTMLLayout(以HTML表格形式布局)
                选项:
                    LocationInfo=true:默认值是false,输出java文件名称和行号。
                    Title=my app file: 默认值是 Log4J Log Messages。
                2. org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
                3. org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
                4. org.apache.log4j.XMLLayout(以XML形式布局)
                选项:
                    LocationInfo=true:默认值是false,输出java文件和行号。
                5. org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
                如果使用PatternLayout布局就要指定的打印信息的具体格式ConversionPattern,打印参数如下:
                    %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL,
                    %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
                    %r: 输出自应用启动到输出该log信息耗费的毫秒数
                    %c: 输出日志信息所属的类目,通常就是所在类的全名
                    %t: 输出产生该日志事件的线程名
                    %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
                    %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
                    %%: 输出一个"%"字符
                    %F: 输出日志消息产生时所在的文件名称
                    %L: 输出代码中的行号
                    %m: 输出代码中指定的消息,产生的日志具体信息
                    %n: 输出一个回车换行符,Windows平台为"/r/n",Unix平台为"/n"输出日志信息换行
                    可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
                    1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
                    2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
                    3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
                    4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉。
        -->
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p:%m %n==> %l%n%n"/>
        </layout>
    </appender>

    <!--
        FileAppender : 输出至指定文件
        选项:
            Threshold=WARN:指定日志消息的输出最低层次。
            ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
            File=mylog.txt:指定消息输出到mylog.txt文件。
            Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
    -->
    <appender name="fileAppender" class="org.apache.log4j.FileAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p:%m %n==> %l%n%n"/>
        </layout>

        <!-- 增加日志Filter过滤范围 -->
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="DEBUG" />
            <param name="LevelMax" value="DEBUG" />
        </filter>
    </appender>

    <!--
        DailyRollingFileAppender : 每天产生一个日志文件
        选项:
            Threshold=WARN:指定日志消息的输出最低层次。
            ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
            File=mylog.txt:指定消息输出到mylog.txt文件。
            Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
            DatePattern='.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。当然也可以指定按月、周、天、时和分。即对应的格式如下:
                1)'.'yyyy-MM: 每月
                2)'.'yyyy-ww: 每周
                3)'.'yyyy-MM-dd: 每天
                4)'.'yyyy-MM-dd-a: 每天两次
                5)'.'yyyy-MM-dd-HH: 每小时
                6)'.'yyyy-MM-dd-HH-mm: 每分钟
    -->
    <appender name="file" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="File" value="/home/taomk/base-rose-web.log"/>
        <param name="DatePattern" value="'_'yyyy-MM-dd'.log'"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p:%m %n==> %l%n%n"/>
        </layout>
    </appender>

    <!--
        RollingFileAppender : 文件到达指定大小时产生一个新文件
        选项:
            Threshold=WARN:指定日志消息的输出最低层次。
            ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
            File=mylog.txt:指定消息输出到mylog.txt文件。
            Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
            MaxFileSize=100KB:后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
            MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
    -->
    <appender name="file" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="/home/taomk/base-rose-web.log"/>
        <param name="DatePattern" value="'_'yyyy-MM-dd'.log'"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p:%m %n==> %l%n%n"/>
        </layout>
    </appender>

    <!-- WriterAppender : 将日志信息以流格式发送到任何地方 -->
    <appender name="file" class="org.apache.log4j.WriterAppender">
        <param name="File" value="/home/taomk/base-rose-web.log"/>
        <param name="DatePattern" value="'_'yyyy-MM-dd'.log'"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p:%m %n==> %l%n%n"/>
        </layout>
    </appender>

    <logger name="org.apache.ibatis">
        <!-- level优先级分别为FATAL、ERROR、WARN、INFO、DEBUG 5个级别(由高到低) -->
        <level value="INFO"/>
        <appender-ref ref="file"/>
    </logger>

    <logger name="org.mybatis.spring">
        <level value="INFO"/>
        <appender-ref ref="file"/>
    </logger>

    <logger name="java.sql">
        <level value="INFO"/>
        <appender-ref ref="file"/>
    </logger>

    <logger name="java.sql.Connection">
        <level value="INFO"/>
        <appender-ref ref="file"/>
    </logger>

    <logger name="java.sql.Statement">
        <level value="INFO"/>
        <appender-ref ref="file"/>
    </logger>

    <logger name="java.sql.PreparedStatement">
        <level value="INFO"/>
        <appender-ref ref="file"/>
    </logger>

    <!--
        additivity:它是 子Logger 是否继承 父Logger 的 输出源(appender) 的标志位。
        具体说,默认情况下子Logger会继承父Logger的appender,也就是说子Logger会在父Logger的appender里输出。
        若是additivity设为false,则子Logger只会在自己的appender里输出,而不会在父Logger的appender里输出。
    -->
    <logger name="org.springframework" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="file"/>
    </logger>

    <root>
        <level value="INFO"/>
        <!-- 优先级 -->
        <priority value="debug"/>
        <appender-ref ref="file"/>
        <appender-ref ref="stdout"/>
    </root>
</log4j:configuration>

#6 高级使用# 实验目的:

1.把FATAL级错误写入2000NT日志

2.WARN,ERROR,FATAL级错误发送email通知管理员

3.其他级别的错误直接在后台输出

实验步骤:

输出到2000NT日志

1.把Log4j压缩包里的NTEventLogAppender.dll拷到WINNT\SYSTEM32目录下

2.写配置文件log4j.properties

# 在2000系统日志输出
log4j.logger.NTlog=FATAL, A8
# APPENDER A8
log4j.appender.A8=org.apache.log4j.nt.NTEventLogAppender
log4j.appender.A8.Source=JavaTest
log4j.appender.A8.layout=org.apache.log4j.PatternLayout
log4j.appender.A8.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

3.调用代码:

Logger logger2 = Logger.getLogger("NTlog"); // 要和配置文件中设置的名字相同
logger2.debug("debug!!!");
logger2.info("info!!!");
logger2.warn("warn!!!");
logger2.error("error!!!");
//只有这个错误才会写入2000日志
logger2.fatal("fatal!!!");

发送email通知管理员

1.首先下载JavaMail和JAF,

http://java.sun.com/j2ee/ja/javamail/index.html
http://java.sun.com/beans/glasgow/jaf.html

在项目中引用mail.jar和activation.jar。

2.写配置文件

# 将日志发送到email
log4j.logger.MailLog=WARN,A5
#  APPENDER A5
log4j.appender.A5=org.apache.log4j.net.SMTPAppender
log4j.appender.A5.BufferSize=5
log4j.appender.A5.To=chunjie@yeqiangwei.com
log4j.appender.A5.From=error@yeqiangwei.com
log4j.appender.A5.Subject=ErrorLog
log4j.appender.A5.SMTPHost=smtp.263.net
log4j.appender.A5.layout=org.apache.log4j.PatternLayout
log4j.appender.A5.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

3.调用代码:

//把日志发送到mail
Logger logger3 = Logger.getLogger("MailLog");
logger3.warn("warn!!!");
logger3.error("error!!!");
logger3.fatal("fatal!!!");

在后台输出所有类别的错误

1.写配置文件

# 在后台输出
log4j.logger.console=DEBUG, A1
# APPENDER A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

2.调用代码

Logger logger1 = Logger.getLogger("console");
logger1.debug("debug!!!");
logger1.info("info!!!");
logger1.warn("warn!!!");
logger1.error("error!!!");
logger1.fatal("fatal!!!");

#7 日志文件路径分析#

方法一:解决的办法自然是用相对路径代替绝对路径,其实log4j的FileAppender本身就有这样的机制,如

log4j.appender.logfile.File=${WORKDIR}/logs/app.log

其中“${WORKDIR}/”是个变量,会被System Property中的“WORKDIR”的值代替。这样,我们就可以在log4j加载配置文件之前,先用System.setProperty ("WORKDIR", WORKDIR);设置好根路径,此操作可通过一初始的servlet进行。

方法二:可以使用服务器环境变量,log4j的配置文件支持服务器的vm的环境变量,格式类似${catalina.home}

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=${catalina.home}/logs/logs_tomcat.log
log4j.appender.R.MaxFileSize=10KB

其中的${catalina.home}并非windows系统的环境变量,这个环境变量就不需要在Windows系统的环境变量中设置。之所以这样,你可以看看tomcat/bin/catalina.bat(startup,shutdown都是调用这个)里面自带有-Dcatalina.home= "%CATALINA_HOME%" 。继承这个思想,所以你也可以自己设定一个参数-Dmylog.home="D:/abc/log"到对应的服务器java启动的vm参数中。

方法三:通过servlet初始化init()方法中加载file属性实现相对路径

具体实现:做一个servlet,在系统加载的时候,就把properties的文件读到一个properties文件中.那个file的属性值(我使用的是相对目录)改掉(前面加上系统的根目录),让后把这个properties对象设置到propertyConfig中去,这样就初始化了log的设置.在后面的使用中就用不着再配置了。

一般在我们开发项目过程中,log4j日志输出路径固定到某个文件夹,这样如果我换一个环境,日志路径又需要重新修改,比较不方便,目前我采用了动态改变日志路径方法来实现相对路径保存日志文件。

public class Log4jInit extends HttpServlet {

	private static Logger logger = Logger.getLogger(Log4jInit.class);

	public Log4jInit() {
	}

	public void init(ServletConfig config) throws ServletException {
		String prefix = config.getServletContext().getRealPath("/");
		String file = config.getInitParameter("log4j");
		String filePath = prefix + file;
		Properties props = new Properties();
		try {
			FileInputStream istream = new FileInputStream(filePath);
			props.load(istream);
			istream.close();
			// toPrint(props.getProperty("log4j.appender.file.File"));
			String logFile = prefix
					+ props.getProperty("log4j.appender.file.File");// 设置路径
			props.setProperty("log4j.appender.file.File", logFile);
			PropertyConfigurator.configure(props);// 装入log4j配置信息
		} catch (IOException e) {
			toPrint("Could not read configuration file [" + filePath + "].");
			toPrint("Ignoring configuration file [" + filePath + "].");
			return;
		}
	}

	public static void toPrint(String content) {
		System.out.println(content);
	}
}

Web.xml配置:

<servlet>
    <servlet-name>log4j-init</servlet-name>
    <servlet-class>Log4jInit</servlet-class>
    <init-param>
        <param-name>log4j</param-name>
	<param-value>WEB-INF/classes/log4j.properties</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

注意:上面的load-on-startup设为0,以便在Web容器启动时即装入该Servlet。log4j.properties文件放在根的properties子目录中,也可以把它放在其它目录中。应该把.properties文件集中存放,这样方便管理。

#8 Spring的Log4jConfigListener使用#

使用spring中的Log4jConfigListener可以随时调整打印日志的级别而不用重启服务,在web.xml中添加如下内容:

<!--如果不定义webAppRootKey参数,那么webAppRootKey就是缺省的"webapp.root"。但最好设置,以免项目之间的名称冲突。
    定义以后,在Web Container启动时将把ROOT的绝对路径写到系统变量里。
    然后log4j的配置文件里就可以用${webName.root}来表示Web目录的绝对路径,把log文件存放于webapp中。
    如果该变量不存在,会存储在项目所在根盘符中,默认为webapp.root。
    此参数用于后面的“Log4jConfigListener”-->
<context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>webName.root</param-value>
</context-param>

<!--由Sprng载入的Log4j配置文件位置-->
<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/log4j.properties</param-value>
</context-param>

<!--Spring默认刷新Log4j配置文件的间隔,单位为millisecond-->
<context-param>
    <param-name>log4jRefreshInterval</param-name>
    <param-value>60000</param-value>
</context-param>

<!-- Web 项目 Spring 加载 Log4j 的监听 -->
<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

© 著作权归作者所有

陶邦仁
粉丝 1684
博文 420
码字总数 1483887
作品 0
海淀
技术主管
私信 提问
log4j.properties配置详解

Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可接key=value格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。 1. 配置文件 Log4...

sfilyh
2012/03/30
818
0
log4j 使用及配置分析记录

log4j是一个非常强大的log记录软件,下面我们就来看看在项目中如何使log4j。 ps:其配置文件有两种 log4j.properties 和log4j.xml 两种形式。xml更强大,功能更丰富 ,properties更简单易懂。...

北方攻城师
2015/04/12
209
0
Log4j 日志配置示例详解

日志是应用软件中不可缺少的部分,Apache的开源项目Log4j是一个功能强大的日志组件,提供方便的日志记录,具体请参考Log4j文档指南。 Log4j下载 在apache网站,可以免费下载到Log4j最新版本的...

长平狐
2013/01/06
161
0
slf4j log4j logback关系详解和相关用法【推荐官网配置】

写java也有一段时间了,一直都有用slf4j log4j输出日志的习惯。但是始终都是抱着“拿来主义”的态度,复制粘贴下配置文件就开始编码了,于是这段时间详细的看了下日志库。 slf4j log4j logb...

Airship
07/27
33
0
spring springmvc mybatis maven 项目整合示例-导航页面

spring原理 实践解析-简单的helloworld spring原理案例-基本项目搭建 01 spring framework 下载 官网下载spring jar包 spring原理案例-基本项目搭建 02 spring jar包详解 spring jar包的用途...

noteless
2018/06/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Python 开发植物大战僵尸游戏

作者:楷楷 链接:https://segmentfault.com/a/1190000019418065 开发思路 完整项目地址: https://github.com/371854496/pygame 更多好玩有趣的python,尽在公众号「Python专栏」,后台回复...

上海小胖
今天
5
0
JVM优化之逃逸分析与分配消除

要了解逃逸分析背后的基本原理,我们先来看下这段有问题的C代码——当然这个是没法用Java来写的: 这段C代码在栈上创建了一个int类型的变量,然后把它的指针作为函数的返回值返回了。这样做是...

onedotdot
今天
3
0
最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
今天
6
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
今天
12
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部