Log4j其实更多的是一个工具,主要用于我们程序运行时需要记录日志的时候,这些日志可以用来进行数据分析和问题定位。
Log4j的官网是:http://logging.apache.org/log4j/2.x/
Maven依赖项添加如下:
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency>
Log4j最重要的使用是配置文件,默认的文件名是log4j.properties和log4j.xml。首先我们通过一个最简单的例子进行讲解。
#首先设置rootLogger,即输出级别过滤和输出目的地 log4j.rootLogger=debug,myappender #输出到控制台 log4j.appender.myappender=org.apache.log4j.ConsoleAppender #样式为TTCCLayout log4j.appender.myappender.layout=org.apache.log4j.TTCCLayout
public class LogUtil { public static void debug(Object sender, Object msg) { Logger logger = Logger.getLogger(sender.getClass()); logger.debug(msg); } public static void info(Object sender, Object msg) { Logger logger = Logger.getLogger(sender.getClass()); logger.info(msg); } public static void warn(Object sender, Object msg) { Logger logger = Logger.getLogger(sender.getClass()); logger.warn(msg); } public static void error(Object sender, Object msg) { Logger logger = Logger.getLogger(sender.getClass()); logger.error(msg); } public static void fatal(Object sender, Object msg) { Logger logger = Logger.getLogger(sender.getClass()); logger.fatal(msg); } }
控制台输出+最简单的SimpleLayout例子:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> <appender name="myConsoleAppender" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.SimpleLayout" /> <param name="ImmediateFlush" value="true" /> <param name="Target" value="System.out" /> <param name="Threshold" value="INFO" /> <!--过滤器设置输出的级别 --> <filter class="org.apache.log4j.varia.LevelRangeFilter"> <param name="levelMin" value="debug" /> <param name="levelMax" value="warn" /> <param name="AcceptOnMatch" value="true" /> </filter> </appender> <!-- 指定logger的设置,additivity指示是否遵循缺省的继承机制 --> <logger name="com.freesoft.testAppender" additivity="false"> <priority value="info" /> <appender-ref ref="myConsoleAppender" /> </logger> <!-- 根logger的设置 --> <root> <!-- root级别输出设置 --> <priority value="debug" /> <!-- 目的地 --> <appender-ref ref="com.freesoft.testAppender" /> </root> </log4j:configuration>
将输出内容写入到文件中。
<appender name="myFileAppender" class="org.apache.log4j.FileAppender"> <param name="ImmediateFlush" value="true" /> <param name="Threshold" value="INFO" /> <layout class="org.apache.log4j.TTCCLayout" /> <param name="Append" value="true" /> <param name="File" value="D:/tmp/log4j.log" /> </appender>
将输出内容写入到不断增长的文件中,如果文件内容增长到一定大小,将会自动写入另一文件。
<!-- Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。 --> <!-- ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。 --> <appender name="myRollingFileAppender" class="org.apache.log4j.RollingFileAppender"> <layout class="org.apache.log4j.HTMLLayout"> <param name="LocationInfo" value="true" /> <param name="Title" value="My Logging" /> </layout> <param name="File" value="D:/tmp/rolling.html" /> <param name="Append" value="true" /> <!-- 后缀可以是KB, MB 或者GB。在日志文件到达该大小时,将会自动滚动,即将原来的内容移到logging.log4j.1文件中。 --> <param name="MaxFileSize" value="10kb" /> <!-- 指定可以产生的滚动文件的最大数,例如,设为2则可以产生logging.log4j.1,logging.log4j.2两个滚动文件和一个logging.log4j文件。 --> <param name="MaxBackupIndex" value="10" /> </appender>
根据设定的时间值,将内容分别写入到不同文件中。这个在我们开发的Web Application中经常用到,我们的日志一般都是按照每天固定保存的,便于问题分析和每天凌晨时分的统计分析。
<!-- Threshold=WARN:指定日志信息的最低输出级别,默认为DEBUG。 --> <!-- ImmediateFlush=true:表示所有消息都会被立即输出,设为false则不输出,默认值是true。 --> <appender name="myDailyRollingFileAppender" class="org.apache.log4j.DailyRollingFileAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{yy-MM-dd HH:mm:ss,SSS\} %-5p] [%t] %c %n -%l - %m%n" /> </layout> <param name="File" value="D:/tmp/rolling.log" /> <param name="Append" value="true" /> <!-- 今天的日志文件名为logging.log4j,前一个月的日志文件名为logging.log4j.yyyy-MM。 --> <!-- 可以指定按周、天、时、分等来滚动日志文件,对应的格式如下: --> <!-- 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:每分钟 --> <param name="DatePattern" value="'.'yyyy-MM-dd" /> </appender>
这个配置用于将服务器上生成的log输出到另一台log服务器。
如果我们一台Web Application服务器需要将日志输出到另一台服务器,可以这样配置(我这里的试验是将其输出到本地):
<!-- 可选参数Threshold --> <appender name="remoteAppender" class="org.apache.log4j.net.SocketAppender"> <!-- 这是远程log server --> <param name="remoteHost" value="localhost" /> <!-- 这是远程log server port --> <param name="port" value="4560" /> <param name="ReconnectionDelay" value="1000" /> <param name="LocationInfo" value="true" /> </appender>
同样还需要对另外一台接收日志的服务器进行配置,这里我使用了properties文件:
# 这里配置的是SocketServer这个Appender的配置,其输出的log会写入到log4jserver.log中 log4j.logger.org.apache.log4j.net.SocketServer=DEBUG,serverFile log4j.additivity.org.apache.log4j.net.SocketServer=false log4j.appender.serverFile=org.apache.log4j.DailyRollingFileAppender log4j.appender.serverFile.DatePattern='.'yyyy-MM-dd-HH log4j.appender.serverFile.encoding=UTF-8 log4j.appender.serverFile.File=D:/tmp/log4jserver.log log4j.appender.serverFile.layout=org.apache.log4j.PatternLayout log4j.appender.serverFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss},%m %n # 这里是log4j的root配置,用于接收客户端传递的log内容 log4j.rootCategory=INFO, globalfile log4j.appender.globalfile=org.apache.log4j.DailyRollingFileAppender log4j.appender.globalfile.DatePattern='.'yyyy-MM-dd-HH log4j.appender.globalfile.encoding=UTF-8 log4j.appender.globalfile.File=D:/tmp/global.log log4j.appender.globalfile.layout=org.apache.log4j.PatternLayout log4j.appender.globalfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss},%m %n
java -cp log4j-1.2.17.jar org.apache.log4j.net.SocketServer 4560 D:/tmp/log4j-server.properties D:/tmp/
log4j.rootCategory=,A4 log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender log4j.appender.A4.file=127.0.0.1.log log4j.appender.A4.DatePattern='.'yyyyMMdd log4j.appender.A4.layout=org.apache.log4j.PatternLayout log4j.appender.A4.layout.ConversionPattern=/n/n[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
LoggerRepository configureHierarchy(InetAddress inetAddress) { cat.info("Locating configuration file for " + inetAddress); String s = inetAddress.toString(); int i = s.indexOf("/"); if (i == -1) { cat.warn("Could not parse the inetAddress [" + inetAddress + "]. Using default hierarchy."); return genericHierarchy(); } // 将下面一行内容注释 // String key = s.substring(0,i); String key = s.substring(i+1); File configFile = new File(this.dir, key + CONFIG_FILE_EXT); if (configFile.exists()) { Hierarchy h = new Hierarchy(new RootLogger(Level.DEBUG)); this.hierarchyMap.put(inetAddress, h); new PropertyConfigurator().doConfigure(configFile.getAbsolutePath(), h); return h; } cat.warn("Could not find config file [" + configFile + "]."); return genericHierarchy(); }
这个配置可以将生成的log以email形式发送。
<appender name="mySMTPAppender" class="org.apache.log4j.net.SMTPAppender"> <param name="Threshold" value="INFO" /> <param name="BufferSize" value="128" /> <!-- 注意不要使用smtp.qq.com,这个地址是需要ssl链接的 --> <param name="SMTPHost" value="smtp.exmail.qq.com" /> <param name="SMTPUsername" value="[email protected]" /> <param name="SMTPPassword" value="xxx" /> <param name="From" value="[email protected]" /> <param name="To" value="[email protected]" /> <param name="Subject" value="测试邮件发送log" /> <param name="LocationInfo" value="true" /> <param name="SMTPDebug" value="true" /> <layout class="org.apache.log4j.SimpleLayout" /> </appender>
这里仅演示写入MySQL数据库的例子:
<appender name="myJDBCAppender" class="org.apache.log4j.jdbc.JDBCAppender"> <param name="URL" value="jdbc:mysql://localhost:3306/log4j" /> <param name="driver" value="com.mysql.jdbc.Driver" /> <param name="user" value="root" /> <param name="password" value="root" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="INSERT INTO log4j(stamp,thread, info_level,class,message) VALUES ('%d', '%t', '%p', '%c', '%m')" /> </layout> </appender>