使用Log4j - Java异常处理

/**
 * Log4j是目前最流行的一种日志框架
 * 它有两个版本:
 * 1.x: Log4j
 * 2.x: Log4j2
 * Log4j是一个组件化设计的日志系统
 * 它是通过append把不同的log输出到不同的目的地
 * 例如Console是输出到屏幕,File是输出到文件,Socket是输出到远程
 * Filter是过滤哪些log是需要被输出,哪些log是不需要被输出,
 * Layout是用来格式化日志的信息,我们在实际使用的时候,并不需要关系Log4j内部的API
 * 而是通过配置文件来配置他
 * Commons Logging可以自动的使用Log4j,如果在classpath中,存在Log4j,
 * Commons Logging就会自动使用Log4j,所以我们始终使用Commons Logging来写日志
 * 在开发阶段我们不需要使用Log4j
 * 我们只需要把正确的配置文件和相关的jar包放入classpath文件就可以了
 * 我们使用配置文件可以灵活的修改日志,而无需修改代码
 * 
 * commons-logging-1.1.2.jar,以及log4j的三个jar包
 * log4j-jcl-2.6.1
 * @author Leon.Sun
 *
 */
public class Log4jDemo {

}
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 这个时候我们注意到Commons Logging在classpath自动发现log4j的jar包
 * 他就会直接使用log4j,这个时候我们看到的日志就是log4j打印的,这个时候我们看到的
 * 日志是由console打印的,也就是只有输出到console的日志会打印在console的输出中
 * 
 * 通过Commons Logging实现日志,不需要修改代码即可使用Log4j
 * 我们使用Log4j只需要把log4j2.xml和相关的jar放入classpath
 * 如果我们要更换Log4j,只需要移除log4j2.xml和相关的jar
 * 只有在我们需要扩展log4j的时候,我们猜需要引用log4j的接口
 * @author Leon.Sun
 *
 */
public class Test {
	
	static final Log log = LogFactory.getLog(CommonsLogging.class);
	
	public static void main(String[] args) {
		
		Person p = new Person("Xiao Ming");
		log.error("call hello(): " + p.hello());
		try {
			new Person(null);
		} catch (Exception e) {
			log.error("Exception when create person.",e);
		}
		log.info("Program end.");
	}

}
log4j2.xml完美配置
https://blog.51cto.com/1197822/2157668

log4j2配置文件log4j2.xml详解(转载)
https://www.cnblogs.com/new-life/p/9246143.html

将log4j.xml修改为log4j2.xml
https://blog.csdn.net/weixin_42522453/article/details/83819983
		<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
		<dependency>
		    <groupId>org.apache.logging.log4j</groupId>
		    <artifactId>log4j-core</artifactId>
		    <version>2.6.2</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
		<dependency>
		    <groupId>org.apache.logging.log4j</groupId>
		    <artifactId>log4j-api</artifactId>
		    <version>2.6.2</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-jcl -->
		<dependency>
		    <groupId>org.apache.logging.log4j</groupId>
		    <artifactId>log4j-jcl</artifactId>
		    <version>2.6.2</version>
		</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<!-- 根节点是一个Configuration -->
 <Configuration status="WARN">
    <Properties>
                <!-- 日志文件默认输出格式,不带行号输出(行号显示会影响日志输出性能);%C:大写,类名;%M:方法名;%m:错误信息;%n:换行 -->
                <!-- 这种定义如何打印日志的格式, -->
                <property name="log.pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %C.%M - %m%n</property>
                <!-- 日志默认切割的最小单位 -->
                <property name="every_file_size">20MB</property>
                <!-- Info日志默认同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
                <property name="info_max">10</property>
                <!-- 日志默认同类型日志,同一文件夹下可以存放的数量,不设置此属性则默认为7个 -->
                <property name="rolling_max">50</property>
                <!-- Info日志默认存放路径(Info级别日志) -->
                <property name="file.all.filename">log/all.log</property>
                <!-- Info日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
                <property name="file.all.pattern">log/all.%i.log.gz</property>
                <!-- Error日志默认存放路径(Error级别日志) -->
                <property name="file.err.filename">log/err.log</property>
                <!-- Error日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 -->
                <property name="file.err.pattern">log/err.%i.log.gz</property>
        </Properties>
   <Appenders>
   	 <!-- 第一个appender是console,也就是屏幕 -->
     <Console name="console" target="SYSTEM_OUT">
       <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
     </Console>
     <!-- 我们定义了一个RollingFile的appender,它的name是all,我们引用了fileName的属性,是我们定义的file.all.filename -->
     <RollingFile name="all" bufferedIO="true" fileName="${file.all.filename}" filePattern="${file.all.pattern}">
             <PatternLayout pattern="${log.pattern}"/>
             <!-- 我们在Policies中定义了一个TriggerPolicy,这个Policy的意思就是每当文件大小达到20M的时候,他就会自动切割,然后生成一个新的log文件 -->
             <Policies>               
             		<SizeBasedTriggeringPolicy size="${every_file_size}"/>
             </Policies>
             <!-- 设置同类型日志,同一文件夹下可以存放的数量,如果不设置此属性则默认存放7个文件 -->
             <DefaultRolloverStrategy max="${info_max}" />
     </RollingFile>
	 <!-- 最后一个appender也是一个rollingFile appender,他的name是err -->
     <RollingFile name="err"  bufferedIO="true" fileName="${file.all.filename}" filePattern="${file.err.filename}">
             <PatternLayout pattern="${log.pattern}"/>
             <Policies>               
             		<SizeBasedTriggeringPolicy size="${every_file_size}"/>
             </Policies>
             <DefaultRolloverStrategy max="${info_max}" />
     </RollingFile>

   </Appenders>
   <!-- 然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->
   <Loggers>
     <!--建立一个默认的root的logger-->
     <!-- 我们先定义了roo log,它的level是info,我们把它关联到三个appender中,分别是console,all,err,
     	      我们对err的level设置error,是所有的error错误都会记录到err这个appender中 -->
     <root level="info">
           <appender-ref ref="console" level="info"/>
           <appender-ref ref="all" level="info"/>
           <appender-ref ref="err" level="error"/>
     </root>
     <!-- 我们可以给一个包的log指定一个level是debug,就是所有debug级别的都会记录到console中 -->
     <!-- <logger name="com.learn.logging" level="debug">
         <appender-ref ref="console"/>
     </logger> -->
   </Loggers>
 </Configuration>

猜你喜欢

转载自blog.csdn.net/Leon_Jinhai_Sun/article/details/89468528