别再说你还不会使用Log4j
Posted Java编程社区
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了别再说你还不会使用Log4j相关的知识,希望对你有一定的参考价值。
精彩资源、技术文章第一时间送达!
推荐阅读
1、
2、
3、
4、
Log4j 安装
Log4j API包是根据Apache软件许可证分发的。
最新的log4j版本,包括全源代码,类文件和文档可以在http://logging.apache.org/log4j/找到。
我们可以从上面的链接下载apache-log4j-x.x.x.tar.gz或zip文件。
支持库
我们可以使用log4j将信息记录到各种目的地,例如发送电子邮件,数据库或文件。
有一个我们需要放到classpath的库的列表,以便log4j可以拿起它并使用它。
例如,当从log4j发出电子邮件时,我们需要电子邮件库jar文件。
库是可选的,并且取决于我们将要与log4j框架一起使用的功能。
JavaMail API(mail.jar): 从https://glassfish.dev.java.net/javaee5/mail/用于基于电子邮件的日志记录。
JavaBeans Activation Framework(activation.jar): 来自http://java.sun.com/products/javabeans/jaf/index.jsp。
Java Message Service: 用于JMS和JNDI。
XML Parser(Xerces.jar): 来自http://xerces.apache.org/xerces-j/install.html。
Maven和Log4j
首先,使用以下maven命令创建一个空的Maven项目。
C:mvn_test>mvn archetype:generate -DgroupId=com.w3cschool.ide -DartifactId=MyTest -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
然后,转到项目文件夹并找到pom.xml,添加以下依赖关系。
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
之后,将以下代码添加到在resources文件夹下创建的log4j.properties。
MyTest | +-src | +-main | +-java | | | +-com | | | +-w3cschool | | | +-ide | +-resources | +- log4j.properties
如上面的文件夹结构所示,资源位于java文件夹的保存级别。
对于Java Web应用程序,将log4j.properties文件存储在WEB-INF/classes目录下 将以下配置保存到log4j.properties文件中。
# Root logger option log4j.rootLogger=DEBUG, stdout, file # Redirect log messages to console 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{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n # Redirect log messages to a log file, support file rolling. log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=C:\log4j.log log4j.appender.file.MaxFileSize=5MB log4j.appender.file.MaxBackupIndex=10 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
最后一个%m%n
配置log4j以添加换行符。
%L设置从记录请求的行号。
%c{1}引用通过getLogger()
设置的日志记录名称。
%-5p设置日志记录优先级,如DEBUG或ERROR。
最后添加以下代码App.java并运行应用程序。
package com.w3cschool.ide; import org.apache.log4j.Logger; public class App{ final static Logger logger = Logger.getLogger(App.class); public static void main(String[] args) { App obj = new App(); obj.runMe("w3cschool"); } private void runMe(String parameter){ if(logger.isDebugEnabled()){ logger.debug("This is debug : " + parameter); } if(logger.isInfoEnabled()){ logger.info("This is info : " + parameter); } logger.warn("This is warn : " + parameter); logger.error("This is error : " + parameter); logger.fatal("This is fatal : " + parameter); } }
以下代码显示如何记录异常。
import org.apache.log4j.Logger;public class App { final static Logger logger = Logger.getLogger(App.class); public static void main(String[] args) { App obj = new App(); try { obj.divide(); } catch (ArithmeticException ex) { logger.error("Sorry, something wrong!", ex); } } private void divide() { int i = 10 / 0; } }
Log4j 配置
我们可以通过设置Log Level,定义Appender和在配置文件中指定Layout对象来配置log4j。
log4j.properties
文件是一个log4j配置文件,它保留键 - 值对中的属性。
默认情况下,LogManager
在CLASSPATH中查找名为log4j.properties的文件。
log4j.properties语法:
以下代码显示了appender X的log4j.properties文件的语法:
# Define the root logger with appender X
log4j.rootLogger = DEBUG, X
# Set the appender named X to be a File appender
log4j.appender.X=org.apache.log4j.FileAppender
# Define the layout for X appender
log4j.appender.X.layout=org.apache.log4j.PatternLayout
log4j.appender.X.layout.conversionPattern=%m%n
log4j支持UNIX风格的变量替换,如${variableName}。
以下示例显示如何创建log4j.properties文件。
它将根记录器的级别设置为DEBUG,并将名为FILE的附加器附加到它。
追加器FILE定义为org.apache.log4j.FileAppender,并写入位于日志目录中的名为“log.out”的文件。
定义的布局模式为%m%n,这意味着打印的日志消息后面将跟随换行符。
# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n
日志级别
我们使用DEBUG和两个appenders。所有可能的选项是:
跟踪
调试
信息
警告
错误
致命
所有
这些级别将在Log4j日志记录级别中解释。
追加者
Apache log4j提供了用于将日志消息打印到不同目标(如控制台,文件,套接字,NT事件日志等)的Appender对象。
每个Appender对象都具有与其关联的不同属性,这些属性指示该对象的行为。
属性 | 描述 |
---|---|
layout | Appender使用布局对象和转换模式来格式化日志记录信息。 |
target | 目标可以是控制台,文件或其他项目,具体取决于附加程序。 |
level | 级别过滤日志消息。 |
threshold | Appender可以具有阈值级别,并忽略具有低于阈值级别的级别的任何日志记录消息。 |
filter | Filter对象决定日志记录请求是由特定Appender处理还是忽略。 |
我们可以使用以下方法在配置文件中添加一个Appender对象到Logger:
log4j.logger.[logger-name]=level, appender1,appender..n
我们可以用XML格式编写相同的配置。
<logger name="com.apress.logging.log4j" additivity="false"> <appender-ref ref="appender1"/> <appender-ref ref="appender2"/> </logger>
要添加Appender对象,请使用以下方法:
public void addAppender(Appender appender);
addAppender()方法将Appender添加到Logger对象。我们可以在逗号分隔的列表中添加许多Appender对象到记录器。
所有可能的追加者选项是:
AppenderSkeleton
AsyncAppender
ConsoleAppender
DailyRollingFileAppender
ExternallyRolledFileAppender
FileAppender
JDBCAppender
JMSAppender
LF5Appender
NTEventLogAppender
NullAppender
RollingFileAppender
SMTPAppender
SocketAppender
SocketHubAppender
SyslogAppender
TelnetAppender
WriterAppender
日志布局
我们可以使用下面的布局列表。
DateLayout
HTMLLayout生成HTML格式的消息。
PatternLayout
SimpleLayout
XMLLayout生成XML格式的消息
输出到控制台
以下log4j.properties
显示如何将信息记录到控制台。
# Root logger option log4j.rootLogger=INFO, stdout # Direct log messages to stdout 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{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
以下xml代码将重写上面列出的配置。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration debug="true" xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" /> </layout> </appender> <root> <level value="DEBUG" /> <appender-ref ref="console" /> </root> </log4j:configuration>
输出到文件
以下log4j.properties
显示如何将信息记录到文件。
# Root logger option log4j.rootLogger=INFO, file # Direct log messages to a log file log4j.appender.file=org.apache.log4j.RollingFileAppender #Redirect to Tomcat logs folder #log4j.appender.file.File=${catalina.home}/logs/logging.log log4j.appender.file.File=C:\my.log log4j.appender.file.MaxFileSize=10MB log4j.appender.file.MaxBackupIndex=10 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
以下xml代码重写上面列出的配置。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration debug="true" xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="file" class="org.apache.log4j.RollingFileAppender"> <param name="append" value="false" /> <param name="maxFileSize" value="10KB" /> <param name="maxBackupIndex" value="5" /> <!-- For Tomcat --> <param name="file" value="${catalina.home}/logs/my.log" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" /> </layout> </appender> <root> <level value="ERROR" /> <appender-ref ref="file" /> </root> </log4j:configuration>
输出到控制台和文件
以下log4j.properties
显示如何将信息记录到文件和控制台。
# Root logger option log4j.rootLogger=INFO, file, stdout # Direct log messages to a log file log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=C:\my.log log4j.appender.file.MaxFileSize=10MB log4j.appender.file.MaxBackupIndex=10 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n # Direct log messages to stdout 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{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
以下xml代码将重写上面列出的配置。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration debug="true" xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" /> </layout> </appender> <appender name="file" class="org.apache.log4j.RollingFileAppender"> <param name="append" value="false" /> <param name="maxFileSize" value="10MB" /> <param name="maxBackupIndex" value="10" /> <param name="file" value="${catalina.home}/logs/my.log" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n" /> </layout> </appender> <root> <level value="DEBUG" /> <appender-ref ref="console" /> <appender-ref ref="file" /> </root> </log4j:configuration>
Log4j HelloWorld
我们使用以下配置文件来控制log4j。
根记录器的级别定义为DEBUG,并将名为FILE的追加器附加到它。
追加器FILE定义为org.apache.log4j.FileAppender,并写入位于日志目录中的名为“log.out”的文件。
定义的布局模式为%m%n,它打印以换行符结尾的日志消息。
# Define the root logger with appender file
log = c:/log4j
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n
log4j在Java代码中
以下Java类展示了如何使用Log4J日志库。
import org.apache.log4j.Logger; import java.io.*; import java.sql.SQLException; import java.util.*;public class Main { /* Get actual class name to be printed on */ static Logger log = Logger.getLogger( log4jExample.class.getName()); public static void main(String[] args) throws IOException,SQLException{ log.debug("Hello this is an debug message"); log.info("Hello this is an info message"); } }
所有库都应该在CLASSPATH中可用,log4j.properties文件应该在PATH中可用。
Log4j 日志记录方法
Logger类具有处理日志记录活动的方法。我们可以使用两个静态方法创建Logger类的实例:
public static Logger getRootLogger();public static Logger getLogger(String name);
第一个方法返回没有名称的根日志记录器。第二个方法按名称返回记录器。记录器的名称可以是任何字符串。我们通常使用类或包名称如下:
static Logger log = Logger.getLogger(log4jExample.class.getName());
日志记录方法
我们可以使用Logger类中的以下方法来记录消息。
方法 | 描述 |
---|---|
public void debug(Object message) | 打印Level.DEBUG级别的消息。 |
public void error(Object message) | 打印Level.ERROR级别的消息。 |
public void fatal(Object message) | 打印具有Level.FATAL级别的消息。 |
public void info(Object message) | 打印Level.INFO级别的消息。 |
public void warn(Object message) | 打印Level.WARN级别的消息。 |
public void trace(Object message) | 打印Level.TRACE级别的消息 |
所有级别都在org.apache.log4j.Level类中定义。
import org.apache.log4j.Logger;public class Main { private static org.apache.log4j.Logger log = Logger.getLogger(Main.class); public static void main(String[] args) { log.trace("Trace Message!"); log.debug("Debug Message!"); log.info("Info Message!"); log.warn("Warn Message!"); log.error("Error Message!"); log.fatal("Fatal Message!"); } }
Log4j 日志级别
org.apache.log4j.Level类具有以下级别。
我们还可以通过对Level类进行子类化来定义我们的自定义级别。
级别 | 描述 |
---|---|
ALL | 所有级别包括自定义级别。 |
DEBUG | 调试消息日志。 |
ERROR | 错误消息日志,应用程序可以继续运行。 |
FATAL | 严重错误消息日志,必须中止运行应用程序。 |
INFO | 信息消息。 |
OFF | 最高可能的排名,旨在关闭日志记录。 |
TRACE | 高于DEBUG。 |
WARN | 用于警告消息。 |
控制级别
在Log4j中,级别是有序的。
如果A>= Y,则在级别为Y的记录器中启用级别X的日志请求。
对于标准级别,我们有ALL <DEBUG<INFO<WARN<ERROR<FATAL<OFF。
以下示例显示如何过滤所有DEBUG和INFO消息。
它使用logger方法setLevel(Level.XXX)
设置所需的日志记录级别。
以下代码打印除Debug和Info之外的所有消息:
import org.apache.log4j.*;public class Main { private static org.apache.log4j.Logger log = Logger .getLogger(Main.class); public static void main(String[] args) { log.setLevel(Level.WARN); log.trace("Trace Message!"); log.debug("Debug Message!"); log.info("Info Message!"); log.warn("Warn Message!"); log.error("Error Message!"); log.fatal("Fatal Message!"); } }
当你编译和运行LogClass程序时,它将产生以下结果:
Warn Message! Error Message! Fatal Message!
使用配置文件设置级别
我们可以使用Log4j配置文件来控制日志级别设置,而不更改源代码。
以下代码显示如何通过配置文件执行log.setLevel(Level.WARN)。
# Define the root logger with appender file
log = c:/log4j
log4j.rootLogger = WARN, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}/log.out
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n
现在让我们使用我们的下面的程序:
import org.apache.log4j.*;public class Main { private static org.apache.log4j.Logger log = Logger.getLogger(Main.class); public static void main(String[] args) { log.trace("Trace Message!"); log.debug("Debug Message!"); log.info("Info Message!"); log.warn("Warn Message!"); log.error("Error Message!"); log.fatal("Fatal Message!"); } }
Log4j 日志格式
Apache log4j提供布局对象,以根据各种布局格式化日志数据。
布局类层次结构中的顶级类是抽象类org.apache.log4j.Layout。
org.apache.log4j.Layout是log4j API中所有其他Layout类的基类。
它有以下子类。
DateLayout
HTMLLayout
PatternLayout。
SimpleLayout
XMLLayout
布局类的方法
下表列出了Layout类中的类。
方法 | 描述 |
---|---|
public abstract boolean ignoresThrowable() | 如果忽略Throwable对象。 |
public abstract String format(LoggingEvent event) | 实现此方法以进行格式化布局。 |
public String getContentType() | 返回布局对象使用的内容类型。 |
public String getFooter() | 记录消息的页脚信息。 |
public String getHeader() | 日志消息的头信息。 |
Log4j 日志到文件
要将信息记录到文件中,请使用org.apache.log4j.FileAppender。
下表列出了FileAppender的可配置参数。
属性 | 描述 |
---|---|
immediateFlush | 默认值为true。刷新每个追加操作的消息。 |
encoding | 更改字符编码。默认为平台特定的编码方案。 |
threshold | 此附加器的阈值级别。 |
Filename | 日志文件的名称。 |
fileAppend | 默认为true。将日志记录信息附加到同一文件的结尾。 |
bufferedIO | 是否缓冲写入。默认为false。 |
bufferSize | 如果启用了缓冲I/O,请设置缓冲区大小。默认值为8kb。 |
例子
以下是FileAppender的配置文件示例log4j.properties。
# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
# file name
log4j.appender.FILE.File=${log}/log.out
# Set the flush to true
log4j.appender.FILE.ImmediateFlush=true
# Set the threshold to debug mode
log4j.appender.FILE.Threshold=debug
# Set the append to true, overwrite
log4j.appender.FILE.Append=true
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.conversionPattern=%m%n
登录多个文件
我们可能希望将消息记录到多个文件中,例如,如果文件大小达到某个阈值,我们希望将消息记录到一个新文件。
要将信息记录到多个文件中,请使用org.apache.log4j.RollingFileAppender类,该类扩展了FileAppender类并继承其所有属性。
下表列出了除FileAppender提到的可配置参数外:
描述 | 描述 |
---|---|
maxFileSize | 将滚动文件的文件的最大大小。 默认值为10MB |
maxBackupIndex | 设置要创建的备份文件数。默认值为1。 |
以下示例显示了RollingFileAppender的示例配置文件log4j.properties。
# Define the root logger with appender file log4j.rootLogger = DEBUG, FILE # Define the file appender log4j.appender.FILE=org.apache.log4j.RollingFileAppender # file name log4j.appender.FILE.File=${log}/log.out # Set the maximum file size before rollover log4j.appender.FILE.MaxFileSize=5KB # Set the the backup index log4j.appender.FILE.MaxBackupIndex=2
每日日志文件
要每天生成日志文件,请使用org.apache.log4j.DailyRollingFileAppender类扩展FileAppender类。
DatePattern
控制何时滚动文件。
描述 | 描述 |
---|---|
DatePattern | 指示何时滚动文件,以及要遵循的命名约定。默认情况下每天午夜滚动。 |
DatePattern支持以下模式:
DatePattern | 描述 |
---|---|
'.' yyyy-MM | 每月结束时滚动。 |
'.' yyyy-MM-dd | 在每天的中午和午夜滚动。 |
'.' yyyy-MM-dd-a | 默认值。每天午夜滚动。 |
'.' yyyy-MM-dd-HH | 滚动在每个小时的顶部。 |
'.' yyyy-MM-dd-HH-mm | 每分钟滚动一次。 |
'.' yyyy-ww | 根据区域设置,每周的第一天滚动。 |
以下代码显示了用于在每天的中午和午夜翻转的配置文件log4j.properties。
# Define the root logger with appender file
log4j.rootLogger = DEBUG, FILE
# Define the file appender
log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender
# Set the name of the file
log4j.appender.FILE.File=${log}/log.out
# Set the DatePattern
log4j.appender.FILE.DatePattern="." yyyy-MM-dd-a
Log4j 日志到数据库
我们可以使用log4j API通过使用org.apache.log4j.jdbc.JDBCAppender对象将信息记录到数据库中。
下表列出了JDBCAppender的配置属性。
属性 | 描述 |
---|---|
bufferSize | 设置缓冲区大小。默认大小为1。 |
driver | JDBC驱动程序类。默认为sun.jdbc.odbc.JdbcOdbcDriver。 |
layout | 设置布局。默认是org.apache.log4j.PatternLayout。 |
password | 设置数据库密码。 |
sql | 指定用于每个日志记录请求的SQL语句。 |
URL | 设置JDBC URL |
user | 设置数据库用户名 |
例子
首先,创建一个表来存储日志信息。
CREATE TABLE LOGS (USER_ID VARCHAR(20) NOT NULL, DATED DATE NOT NULL, LOGGER VARCHAR(50) NOT NULL, LEVEL VARCHAR(10) NOT NULL, MESSAGE VARCHAR(1000) NOT NULL );
然后,为JDBCAppender创建配置文件log4j.properties,该文件控制如何连接到数据库以及如何将日志消息存储到LOGS表。
# Define the root logger with appender file log4j.rootLogger = DEBUG, DB # Define the DB appender log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender # Set JDBC URL log4j.appender.DB.URL=jdbc:mysql://localhost/Your_Database_Name # Set Database Driver log4j.appender.DB.driver=com.mysql.jdbc.Driver # Set database user name and password log4j.appender.DB.user=your_user_name log4j.appender.DB.password=your_password # Set the SQL statement to be executed. log4j.appender.DB.sql=INSERT INTO LOGS VALUES("%x","%d","%C","%p","%m") # Define the layout for file appender log4j.appender.DB.layout=org.apache.log4j.PatternLayout
以下代码显示如何将信息记录到数据库中。
import org.apache.log4j.Logger; import java.sql.*; import java.io.*; import java.util.*;public class Main{ static Logger log = Logger.getLogger(Main.class.getName()); public static void main(String[] args) throws IOException,SQLException{ log.debug("Debug"); log.info("Info"); } }
原文链接:https://www.w3cschool.cn/java/log4j-installation.html
-END-
以上是关于别再说你还不会使用Log4j的主要内容,如果未能解决你的问题,请参考以下文章
福利 | 史上最全Oracle教程来袭—16.5G超详细视频/讲义/笔记汇总,别再说你不懂Oracle了
别再说你不会ElasticSearch调优了,都给你整理好了