1. 개요
1.1 배경
우리의 일상적인 개발에서 로깅은 매우 중요합니다. 일반적으로 애플리케이션에 로깅을 추가하는 데에는 세 가지 목적이 있습니다. 코드의 변수 변경 사항을 모니터링하고 다른 애플리케이션의 통계 분석을 위해 이를 파일에 주기적으로 기록하여 향후 감사 작업의 기반으로 코드의 런타임 궤적을 추적합니다. 통합 개발 환경의 디버거로서 코드 디버깅 정보를 파일이나 콘솔에 인쇄합니다.
1.2 소개
Log4j(log for java)는 Apache의 오픈소스 프로젝트로 섬세한 로그 관리 방법을 제공합니다. 구성 파일을 통해 여러 옵션으로 각 로그의 출력 형식과 대상을 제어할 수 있습니다. 정보 수준을 정의함으로써 코드에서 피드백 정보를 유연하게 전환할 수도 있습니다. 간단히 말해서 log4j는 개발자가 로그 출력을 관리하는 데 도움이 되는 API 라이브러리입니다. 가장 중요한 특징은 구성 파일이 로그 정보의 우선순위, 로그 정보의 출력 대상, 로그 정보의 출력 형식을 유연하게 설정할 수 있다는 것입니다.
2.log4j 구성
2.1log4j 클래스 다이어그램
Logger - 프로그래머가 로그 정보를 출력하는 로그 작성기
Appender - 로그 대상, 지정된 위치에 형식화된 로그 정보 출력
ConsoleAppender - 대상이 콘솔인 Appender
FileAppender - 대상이 파일인 Appender
RollingFileAppender - 대상이 콘솔인 Appender 대상은 제한된 크기의 파일입니다
레이아웃 - 프로그래머의 로깅 요청을 문자열로 형식화하는 데 사용되는 로그 포맷터
PatternLayout - 지정된 패턴으로 로깅 요청의 레이아웃 형식 지정
2.2 구성 파일 정의
Log4j는 Java 프로그램을 통해 동적으로 설정할 수 있습니다. 이 방법의 명백한 단점은 로그 출력 수준 및 기타 정보를 수정해야 하는 경우 Java 파일을 수정해야 한다는 것입니다. 그런 다음 다시 컴파일하면 매우 번거롭습니다.
구성 파일을 사용하면 애플리케이션에서 로그를 보다 유연하게 구성할 수 있습니다. 로그 출력 방법에는 출력 우선 순위, 출력 대상 및 출력 형식이 포함됩니다. Log4j는 두 가지 구성 파일 형식을 지원합니다. 하나는 XML 형식 파일이고 다른 하나는 Java 속성 파일 log4j.properties(key=value)입니다.
n xml 파일
n 속성 파일(권장)
2.3 구성 파일 log4j.properties
Log4J가 처음 호출되면 Log4J는 Path(. ./web-inf/class/, 물론 해당 디렉토리가 클래스 경로에 포함되어 있는 한 다른 디렉토리에 배치할 수도 있으며 이 파일의 전체 구성을 읽을 수 있습니다. 이 구성 파일은 Log4J에게 어떤 형식, 어떤 종류의 정보, 출력 위치를 알려줍니다. 따라서 세 가지 측면을 구성해야 합니다.
1. 루트 디렉터리(레벨 및 대상)
2. 대상(콘솔, 파일 등); . 출력 스타일(로그 내용 표시 방법)
예제는 다음과 같습니다.
#로그 출력 수준 설정
log4j.rootLogger=debug ,appender1
#콘솔로 출력
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
#스타일은 TTCCLayout
log4j입니다. appender1.layout=org.apache.log4j.TTCCLayout
2.4.log4j 세 가지 구성 요소 설명Log4j에는 Logger(로거), Appender(출력 소스) 및 Layout의 세 가지 주요 구성 요소가 있습니다. 이 세 가지 구성 요소를 결합하여 사용하면 정보의 유형과 수준을 쉽게 기록하고 런타임 시 로그 출력의 스타일과 위치를 제어할 수 있습니다. 세 가지 구성 요소는 아래에 설명되어 있습니다.
2.4.1 Logger Logger
Logger 개체는 프로그래머가 로그 정보를 출력하기 위해 System.out 또는 System.err을 대체하는 데 사용되는 로그 작성기입니다.
루트 Logger를 구성합니다. 구문은 다음과 같습니다.
log4j.rootLogger = [level],appenderName,appenderName,…
여기서 level은 우선 순위입니다. 로깅은 OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL 또는 사용자 정의 수준으로 구분됩니다. Log4j에서는 높은 수준부터 낮은 수준까지 ERROR, WARN, INFO 및 DEBUG의 4가지 수준만 사용할 것을 권장합니다. 여기에 정의된 레벨을 통해 로그 정보가 애플리케이션의 해당 레벨로 전환되는 것을 제어할 수 있습니다. 예를 들어 여기에 INFO 수준이 정의되면 애플리케이션의 모든 DEBUG 수준 로그 정보가 인쇄되지 않습니다. appenderName은 로그 정보가 출력되는 위치를 지정합니다. 여러 출력 대상을 동시에 지정할 수 있습니다.
2.4.2 출력 대상 어펜더
Log4j 로그 시스템을 사용하면 콘솔, 파일 등 다양한 위치에 로그를 출력하고 일수나 파일 크기에 따라 새 로그를 생성할 수 있습니다. . 파일을 스트림 등의 형태로 다른 장소로 전송합니다.
어펜더 구성, 구문은 다음과 같습니다:
log4j.appender.appenderName = fully.qualified.name.of.appender.class log4j.appender.appenderName.option1 = value1 … log4j.appender.appenderName.option = valueN
"fully.qualified.name.of.appender.class"可以指定下面五个目的地中的一个:
1).org.apache.log4j.ConsoleAppender(控制台)
2).org.apache.log4j.FileAppender(文件)
3).org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
4).org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
5).org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
(1).ConsoleAppender选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
Target=System.err:默认情况下是:System.out,指定输出控制台
(2).FileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。
File=mylog.log:指定消息输出到mylog.log文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
(3).DailyRollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意味着所有的消息都会被立即输出。
File=mylog.log:指定消息输出到mylog.log文件。
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: 每分钟
4.RollingFileAppender 选项
Threshold=WARN:指定日志消息的输出最低层次。
ImmediateFlush=true:默认值是true,意味着所有的消息都会被立即输出。
File=mylog.log:指定消息输出到mylog.log文件。
Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。
MaxFileSize=100KB: 后缀可以是KB, MB或者是 GB.在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。
MaxBackupIndex=2:指定可以产生的滚动文件的最大数。
2.4.3格式(布局)Layout
有时希望根据自己的喜好格式化自己的日志输出。Log4j可以在Appender的后面附加Layout来完成这个功能。
配置Layout,其语法表示为:
log4j.appender.appenderName.layout =fully.qualified.name.of.layout.class log4j.appender.appenderName.layout.option1 = value1 … log4j.appender.appenderName.layout.option = valueN
Layout提供了四种日志输出样式,如下所示:
(1).org.apache.log4j.HTMLLayout(以HTML表格形式布局),
(2).org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
(3).org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
(4).org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
HTMLLayout 选项
LocationInfo=true:默认值是false,输出java文件名称和行号
Title=my app file: 默认值是 Log4J Log Messages.
2.PatternLayout 选项
ConversionPattern=%m%n :指定怎样格式化指定的消息。
这里需要说明的就是日志信息格式中几个符号所代表的含义:
-x号:x信息输出时左对齐
%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: 输出一个回车换行符
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
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字符,就从左边把多出的字符截掉。
2.5.log4j配置示例
LOG4J的配置之简单使它遍及于越来越多的应用中:Log4J配置文件实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签等全套功能。
log4j.rootLogger=DEBUG,CONSOLE,A1,im log4j.addivity.org.apache=true
n 应用于控制台
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=%d-%c-%-4r[%t]%-5p%c%x-%m%n
n 应用于文件
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=%d - %c -%-4r [%t] %-5p %c %x - %m%n
n 应用于文件回滚
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=%d - %c -%-4r [%t] %-5p %c %x - %m%n
n 应用于socket
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender log4j.appender.SOCKET.RemoteHost=localhost log4j.appender.SOCKET.Port=5001 log4j.appender.SOCKET.LocationInfo=true 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
n 发送日志给邮件
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender log4j.appender.MAIL.Threshold=FATAL log4j.appender.MAIL.BufferSize=10 log4j.appender.MAIL.From=web@www.wuset.com log4j.appender.MAIL.SMTPHost=www.wusetu.com log4j.appender.MAIL.Subject=Log4J Message log4j.appender.MAIL.To=web@www.wusetu.com log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout log4j.appender.MAIL.layout.ConversionPattern=%d-%c-%-4r[%t]%-5p%c%x-%m%n
n 用于数据库
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 ('%d - %c -%-4r [%t] %-5p %c %x - %m%n') log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout log4j.appender.DATABASE.layout.ConversionPattern=%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
n 自定义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@cybercorlin.net log4j.appender.im.layout=org.apache.log4j.PatternLayout log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
3.在WEB应用中为SPRING配置Log4j
首先需要在web.xml文件中加入下面的配置语句:
<!-- 为避免项目间冲突,定义唯一的 webAppRootKey--> <context-param> <param-name>webAppRootKey</param-name> <param-value>myProject.root</param-value> </context-param> <!-- 加载log4j的配置文件log4j.properties --> <context-param> <param-name>log4jConfigLocation</param-name> <param-value>/WEB-INF/classes/config/log4j/log4j.properties</param-value> </context-param> <!-- 设定刷新日志配置文件的时间间隔,这里设置为60s --> <context-param> <param-name>log4jRefreshInterval</param-name> <param-value>60000</param-value> </context-param> <!-- 加载Spring框架中的log4j监听器Log4jConfigListener --> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener>
属性log4jConfigLocation的值建议还是设置为:/WEB-INF/classes/log4j.properties,这样我们在不启动web应用的时候,做一些测试就能够正确地记录日志信息。Log4jConfigListener是spring提供的工具类,它开启一个log4j的监视线程,并每60(log4jRefreshInterval变量定义)秒检测日志配置变化,从而不需要每次重新启动web服务来应用新的配置。在tomcat中没有根据web应用来分开系统属性。所以必须为每一个web应用定义唯一的"webAppRootKey",我们取名为webApp.root.在启动环境后,Log4jConfigListener会将值注入到webApp.root变量。
4.在代码中使用Log4j
4.1.得到记录器
使用Log4j,第一步就是要获取日志记录器,这个记录器将负责控制日志信息。
public static Logger getLogger( String name)
通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。name一般取本类的名字,比如:
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )
4.2.读取配置文件
当获得了日志记录器之后,第二步将配置Log4j环境,其语法为:
若将log4j.properties放在工程根目录下也可不写此句,程序会自动找到配置文件。
BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。
DOMConfigurator.configure ( String filename ):读取XML形式的配置文件。
log4j使用以上3种配置器来初始化,使用PropertyConfigurator适用于所有的系统。如下的语句。
PropertyConfigurator.configure("log4j.properties");
对于一般的java project可以不使用上面的语句初始化log4j,log4j会自动在classpath下,找到配置文件并初始化。如果log4j不能自动初始化配置文件,那么就需要用上面的方法进行初始化。
注意:初始化配置文件,最好只在系统启动的时候执行一次,如果执行多次,一是浪费资源,二就是对于老版本的log4j,使用DailyRollingFileAppender时,可能会出现问题。
4.3.插入记录信息(格式化日志信息)
当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:
Logger.debug ( Object message ) ;
更多Java 로깅 소프트웨어 Log4j의 기본 사용 튜토리얼相关文章请关注PHP中文网!