Log4j其实更多的是一个工具,主要用于我们程序运行时需要记录日志的时候,这些日志可以用来进行数据分析和问题定位。
Log4j的官网是:http://logging.apache.org/log4j/2.x/
Maven依赖项添加如下:
log4j
log4j
${log4j.version}
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例子:
将输出内容写入到文件中。
将输出内容写入到不断增长的文件中,如果文件内容增长到一定大小,将会自动写入另一文件。
根据设定的时间值,将内容分别写入到不同文件中。这个在我们开发的Web Application中经常用到,我们的日志一般都是按照每天固定保存的,便于问题分析和每天凌晨时分的统计分析。
这个配置用于将服务器上生成的log输出到另一台log服务器。
如果我们一台Web Application服务器需要将日志输出到另一台服务器,可以这样配置(我这里的试验是将其输出到本地):
同样还需要对另外一台接收日志的服务器进行配置,这里我使用了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形式发送。
这里仅演示写入MySQL数据库的例子: