slf4+log4j2简单配置
在网上看了好多的,还没有完全了解门面日志,简单的配置了一下,到是能用,以后再慢慢积累。闲话少说,直接上代码:
1.导包
<!-- 引入slf4j的核心包 url:::https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <!-- 引入slf4j对应log4j2的中间件 url:::https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <scope>runtime</scope> <version>2.11.0</version> </dependency> <!-- 引入log4j2核心包 URL::https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <scope>runtime</scope> <version>2.11.0</version> </dependency>
2.配置文件,文件名log4j2.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE xml> <!-- status="OFF",可以去掉,它的含义为是否记录log4j2本身的event信息,默认是OFF --> <configuration status="OFF"> <!-- 日志文件位置及名称 --> <Properties> <!-- 日志名称 --> <Property name="infoLog">info.log</Property> <Property name="errorLog">error.log</Property> <!-- 日志位置 --> <!-- 日志位置在tomcat根目录下 --> <!-- <Property name="tomcatClasspath" >${sys:catalina.home}/logInfo</Property> --> <!-- 日志位置在自定义磁盘位置 --> <Property name="tomcatClasspath" >C:/Users/Administrator/Desktop/logInfo</Property> <!-- 日志位置在eclipse根目录下 --> <!-- <Property name="tomcatClasspath" >logInfo</Property> --> </Properties> <!-- 输出终端配置 --> <appenders> <!-- 1.输出控制台的配置 target有两种输出方式:SYSTEM_OUT(默认)、SYSTEM_ERR --> <Console name="Console" target="SYSTEM_ERR"> <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --> <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/> <!-- 日志输出的格式: 时间 日志级别 类路径 行 方法 - 日志信息 --> <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/> </Console> <!-- 2.将日志保存到指定文件 --> <!-- append属性,每次运行tomcat时是否覆盖指定的日志文件(TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true) --> <File name="errorFile" fileName="${tomcatClasspath}/${infoLog}" append="true"> <!-- 添加过滤器,可以有选择的输出类别; 将level及其以上级别的日志(onMatch)保存到指定文件,其他级别的直接拒绝(onMismatch) --> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> <!-- 保存日志的格式: 年-月-日 at 时分秒 时区 日志级别 类的完全限定名 所在行 所在方法 - 具体日志信息--> <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/> </File> <!-- 这个会打印出所有信息,每次大小超过 size,则这size大小的日志会自动存入按年份-月份 建立的文件夹下面并进行压缩,作为存档 --> <!-- filePattern:压缩后的文件路径 --> <RollingFile name="RollingFile" fileName="${tomcatClasspath}/${errorLog}" filePattern="${tomcatClasspath}$${date:yyyy-MM}/app-%d{yyyyMMddHHmmssSSS}.log.gz" immediateFlush="true"> <!-- 日志输出格式 --> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS z} %-5level %class{36} %L %M - %msg%xEx%n"/> <!-- 日志文件大小(256KB 或 1MB) --> <SizeBasedTriggeringPolicy size="128KB"/> <!-- 最多保留文件数 --> <DefaultRolloverStrategy max="2"/> </RollingFile> </appenders> <!-- logger配置,只有定义了logger并引入的appender,appender才会生效 --> <loggers> <!--建立一个logger,此logger监听name对应的包名下的日志输出,level表示日志级别--> <!-- <Logger name="com.goatherd.erp.ssm.controller" level="trace" additivity="true"> <AppenderRef ref="Console" /> </Logger> --> <!--建立一个logger,此logger监听name对应的包名下的日志输出,level表示日志级别--> <!-- <Logger name="com.goatherd.erp.ssm.controller" level="info" additivity="true"> <AppenderRef ref="errorFile" /> </Logger> --> <!-- 将业务dao接口填写进去,并用控制台输出即可,这样只要调用到该包下的dao就会在控制台输出,适合测试用 --> <logger name="com.goatherd.erp.ssm.dao" level="TRACE" additivity="false"> <appender-ref ref="Console" /> </logger> <!-- 建立一个默认的root的logger。 --> <!-- 如果没有这个Root也会保存,所以不是很明白这个的作用。 --> <!-- 如果Root中引用的和Logger中引用的重复,则日志记录也会重复。 --> <!-- 属性level是日志的级别,level将和引用里的级别组合使用(level高于引用中的级别则按照此level,level低于引用中的级别则按引用中的级别)--> <Root level="trace"> <!-- <AppenderRef ref="Console" /> --> <AppenderRef ref="errorFile" /> <AppenderRef ref="RollingFile" /> </Root> </loggers> </configuration>
3.Controller测试
Logger logger = LoggerFactory.getLogger(LoginController.class); @Resource private TestDao testDao; @RequestMapping("/login.do") @ResponseBody public JsonResult login(String username,String password,String randomcode,HttpServletRequest request) { String[] err = null; try { String a = err[0]; } catch (Exception e1) { logger.error(e1.getMessage(),e1); logger.info(e1.getMessage(),e1); } System.out.println("登录 。。。。。。"); logger.trace("trace---1"); logger.debug("debug---2"); logger.info("info-----3"); logger.warn("warn-----4"); logger.error("error---5"); testDao.selectUserInfo(); Subject subject = SecurityUtils.getSubject(); AuthenticationToken token = new UsernamePasswordToken(username, password); String msg = null; int state = 0; try { subject.login(token);//执行认证操作. 调用realm }catch(UnknownAccountException u){ msg = "账号错误";state = 1; }catch(IncorrectCredentialsException i){ msg = "密码错误";state = 1; }catch (AuthenticationException e) { msg = "认证失败";state = 1; } return new JsonResult(state,null,msg); }
4.junit测试类
public class TestDAO { private TestDao testDao; private ApplicationContext config; @Before public void init(){ String[] conf = {"config/spring-mvc.xml", "config/spring-mybatis.xml"}; config = new ClassPathXmlApplicationContext(conf); } @Test public void test01() { testDao = config.getBean("testDao",TestDao.class); System.out.println(testDao.selectUserInfo());
//这里测试的话就会将SQL打印出来了 } }
5.文件位置
5.1如果文件放在resource的根目录下,则不需要配置
5.2如果文件放在resource的其他目录下,在web.xml中配置
<!-- log4j2配置文件的位置i --> <context-param> <param-name>log4jConfiguration</param-name> <param-value>classpath:config/log4j2.xml</param-value> </context-param> <listener> <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class> </listener>
但是需要增加一个jar包:
<!-- 用于解决web环境下关闭服务器时可能出现的log4j线程无法及时关闭的warn,web工程需要包含log4j-web,非web工程不需要 https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-web --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-web</artifactId> <scope>runtime</scope> <version>2.11.0</version> </dependency>