• 导入依赖的jar包

  

<log4j.version>1.2.16</log4j.version>

<!-- 自动引入slf4j-api.jar,log4j.jar,以及slf4j-log4j12.jar-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
  • web.xml中配置Log4j

  

<!-- 配置log4j.xml监听器 -->
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
<!-- 配置加载log4j.xml文件路径 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4j.xml</param-value>
</context-param>
<!-- 配置log4j.xml变量,如果需要动态的就使用下面方式,使用方法${name} -->
<context-param>
<param-name>errorLevel</param-name>
<param-value>ERROR</param-value>
</context-param>
<context-param>
<param-name>infoLevel</param-name>
<param-value>INFO</param-value>
</context-param>
<context-param>
<param-name>debugLevel</param-name>
<param-value>DEBUG</param-value>
</context-param>
<context-param>
<param-name>rootLevel</param-name>
<param-value>ALL</param-value>
</context-param>
  • mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="logImpl" value="LOG4J" /><!-- 这里不加也可以实现sql打印,估计内部有这方面的检测规则 -->
</settings>
<!-- 实体类,简称 -设置别名 -->
<typeAliases>
<typeAlias alias="User" type="com.only.mate.entity.User" />
</typeAliases>
<!-- 实体接口映射资源 -->
<!-- 说明:如果xxMapper.xml配置文件放在和xxMapper.java统一目录下,mappers也可以省略,
因为org.mybatis.spring.mapper.MapperFactoryBean默认会去查找与xxMapper.java相同目录和名称的xxMapper.xml -->
<mappers>
<mapper resource="com/only/mate/mapper/UserMapper.xml" />
</mappers>
</configuration>
  • 引入Log4j.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<!--
off:************最高等级的,用于关闭所有日志记录
fatal(Object message):输出FATAL级别的消息。
error(Object message):输出ERROR级别的消息。
warn (Object message):输出WARN级别的消息。
info (Object message):输出INFO级别的消息。
debug(Object message):输出DEBUG级别的消息。
trace(Object message):输出TRACE级别的消息。
all:************最低等级的,用于打开所有日志记录
注:只有当输出日志的级别大于或等于为日志配置器配置的日志级别时,这个方法才会执行
--> <!-- 可以配置多个appender来对应不同的输出,如文件输出,sql输出,控制台输出,邮件输出等 -->
<!-- [控制台STDOUT] 不同的输出类型对应着不同的calss,如控制台输出class对应着 org.apache.log4j.ConsoleAppender -->
<appender name="console" class="org.apache.log4j.ConsoleAppender"> <!-- name提供给logger或者root调用 -->
<param name="encoding" value="UTF-8" /> <!-- 保存字符集 -->
<param name="target" value="System.out" /> <!-- 输出到控制台 -->
<layout class="org.apache.log4j.PatternLayout"> <!-- loyout表示输出方式,可以多种,class值区分,PatternLayout表示自定义格式 -->
<param name="ConversionPattern"
value="%d{ISO8601} 耗时:%r 日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m%n" /> <!-- 输出格式,后面解释 -->
</layout>
<!--filter过滤器设置输出的级别:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF 所有下面输出的是debug到warn不会有error和fatal -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="DEBUG" />
<param name="levelMax" value="FATAL" />
<param name="AcceptOnMatch" value="TRUE" />
</filter>
<!-- 设置Filter:
包括选择过滤器和设置过滤条件,可选择的过滤器包括:LogLevelMatchFilter、LogLevelRangeFilter、和StringMatchFilter:
对LogLevelMatchFilter来说,过滤条件包括LogLevelToMatch和AcceptOnMatch(true|false), 只有当log信息的LogLevel值与LogLevelToMatch相同,且AcceptOnMatch为true时才会匹配。
LogLevelRangeFilter来说,过滤条件包括LogLevelMin、LogLevelMax和AcceptOnMatch,只有当log信息的LogLevel在LogLevelMin、LogLevelMax之间同时AcceptOnMatch为true时才会匹配。
对StringMatchFilter来说,过滤条件包括StringToMatch和AcceptOnMatch,只有当log信息的LogLevel值与StringToMatch对应的LogLevel值与相同, 且AcceptOnMatch为true时会匹配。
过滤条件处理机制类似于IPTABLE的Responsibility chain,(即先deny、再allow)不过执行顺序刚好相反,后写的条件会被先执行,比如:
log4cplus.appender.append_1.filters.1=log4cplus::spi::LogLevelMatchFilter
log4cplus.appender.append_1.filters.1.LogLevelToMatch=TRACE
log4cplus.appender.append_1.filters.1.AcceptOnMatch=true
log4cplus.appender.append_1.filters.2=log4cplus::spi::DenyAllFilter
会首先执行filters.2的过滤条件,关闭所有过滤器,然后执行filters.1,仅匹配TRACE信息
-->
</appender> <!-- [公共Appender] 这个class表示输入到文件,并且按日期生成新文件 -->
<appender name="DEFAULT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${webapp.root}/logs/common-default.log" /> <!-- ${webapp.root}项目根路径,自动获得,不用配置,可自己在web.xml中配置 -->
<param name="MaxFileSize" value="10MB"/><!-- 文件大小不超过10MB -->
<param name="MaxBackupIndex" value="10"/><!-- 保留10个备份文件 -->
<param name="Append" value="TRUE" /> <!-- 是否项目重启继续保存之前日志 -->
<param name="encoding" value="GBK" />
<param name="threshold" value="ALL" /> <!-- 记录所有类型日志,记录它和比它等级高的日志ALL<DEBUG -->
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" /> <!-- 日期格式 例子:common-default.log.2015-09-17.log -->
<layout class="org.apache.log4j.PatternLayout"> <!-- 输出方式 -->
<param name="ConversionPattern"
value="%d{ISO8601} 耗时:%r 日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m%n" />
</layout>
</appender> <!-- [错误日志APPENDER] -->
<appender name="ERROR-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${webapp.root}/logs/error-log.log" />
<param name="Append" value="TRUE" />
<param name="encoding" value="GBK" />
<param name="threshold" value="ERROR" /> <!-- 记录所有类型日志,记录它和比它等级高的日志ALL<DEBUG -->
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{ISO8601} 耗时:%r 日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m%n" />
</layout>
</appender> <!-- [debug日志APPENDER] -->
<appender name="DEBUG-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${webapp.root}/logs/debug-log.log" />
<param name="Append" value="true" />
<param name="encoding" value="GBK" />
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{ISO8601} 耗时:%r 日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m%n" />
</layout>
</appender> <!-- [info日志APPENDER] -->
<appender name="INFO-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${webapp.root}/logs/info-log.log" />
<param name="Append" value="TRUE" />
<param name="encoding" value="GBK" />
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{ISO8601} 耗时:%r 日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m%n" />
</layout>
<!-- 我只想记录INFO以上级别日志,就做如下设置 -->
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="levelMin" value="INFO" />
<param name="levelMax" value="FATAL" />
</filter>
</appender> <!-- [组件日志APPENDER] -->
<appender name="COMPONENT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="${webapp.root}/logs/logistics-component.log" />
<param name="Append" value="TRUE" />
<param name="encoding" value="GBK" />
<param name="DatePattern" value="'.'yyyy-MM-dd'.log'" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern"
value="%d{ISO8601} 耗时:%r 日志来自:%-40.40c{3} 日志类型: %-5p 日志内容:%m%n" />
</layout>
</appender> <!-- 日志写出器 error log -->
<logger name="ErrorLogger">
<level value="ERROR" />
<!-- <level value="${errorLevel }" /> --> <!-- 这种方式level读取不了web.xml中的值,都是debug -->
<appender-ref ref="COMPONENT-APPENDER" />
<appender-ref ref="ERROR-APPENDER" />
</logger> <!-- 日志写出器 debug log -->
<logger name="debugLogger" additivity="true"> <!-- additivity是 子Logger 是否继承 父Logger 的 输出源(appender) 的标志位。具体说,默认情况下 子Logger 会继承 父Logger 的appender,也就是说 子Logger 会在 父Logger 的appender里输出。若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出 -->
<level value="DEBUG" /> <!-- 现在级别 -->
<!-- <level value="${debugLevel}" /> --> <!-- 这种方式level读取不了web.xml中的值,都是debug -->
<appender-ref ref="DEBUG-APPENDER" />
</logger> <!-- 日志写出器 info log -->
<!-- name指定的是包名,表示这个logger只记录com.only.mate下的所有日志 -->
<logger name="com.only.mate" additivity="true">
<level value="INFO" />
<!-- <level value="${infoLevel}" /> --> <!-- 这种方式level读取不了web.xml中的值,都是debug -->
<appender-ref ref="INFO-APPENDER" />
</logger> <!-- 日志写出器Root Logger -->
<!-- 所有logger的父类,记录所有的日志。 -->
<root>
<level value="ALL" /> <!-- 限定记录等级 -->
<appender-ref ref="DEFAULT-APPENDER" /> <!-- 调用记录方式 -->
<appender-ref ref="console" />
</root> </log4j:configuration>

注意:动态配置<level value="${infoLevel}" />这样的方式level读取不到web.xml中的值,都是debug,具体原因不清楚

  • 调用
public class UserController {
private static Logger logger = LoggerFactory.getLogger(UserController.class);
private static Logger debugLogger = LoggerFactory.getLogger("DebugLogger");
private static Logger errorLogger = LoggerFactory.getLogger("ErrorLogger");   @ResponseBody
@RequestMapping(value="/login")
public Map<String, Object> login(HttpServletRequest req, HttpServletResponse res){
Map<String, Object> response = new HashMap<String, Object>();
response.put("state", "0"); String username = req.getParameter("username");
String password = req.getParameter("password");
logger.debug("登录,用户名{},密码{}", username, password);
debugLogger.debug("登录,用户名{},密码{}", username, password);
errorLogger.debug("登录,用户名{},密码{}", username, password);
if(StringUtils.isNotBlank(username)){
User user = userService.findOne(username);
if(user != null){
if(user.getPassword().equals(password)){
response.put("state", "1");
response.put("data", user);
}else {
response.put("message", "账户或密码错误!");
logger.error("账户或密码错误!");
debugLogger.error("账户或密码错误!");
errorLogger.error("账户或密码错误!");
}
}else {
response.put("message", "此账户不存在!");
logger.error("此账户不存在!");
errorLogger.error("此账户不存在!");
}
}else {
response.put("message", "输入有误!");
logger.error("登录出错!");
errorLogger.error("登录出错!");
}
return response;
}
}

完成。


 

Spring+Log4j的集成总结的更多相关文章

  1. 细说shiro之五:在spring框架中集成shiro

    官网:https://shiro.apache.org/ 1. 下载在Maven项目中的依赖配置如下: <!-- shiro配置 --> <dependency> <gr ...

  2. 写给大忙人的CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日志集成环境搭建完整指南

    现在的公司由于绝大部分项目都采用分布式架构,很早就采用ELK了,只不过最近因为额外的工作需要,仔细的研究了分布式系统中,怎么样的日志规范和架构才是合理和能够有效提高问题排查效率的.经过仔细的分析和研究 ...

  3. ELK学习笔记之CentOS 7下ELK(6.2.4)++LogStash+Filebeat+Log4j日志集成环境搭建

    0x00 简介 现在的公司由于绝大部分项目都采用分布式架构,很早就采用ELK了,只不过最近因为额外的工作需要,仔细的研究了分布式系统中,怎么样的日志规范和架构才是合理和能够有效提高问题排查效率的. 经 ...

  4. Spring和ActiveMQ集成实现队列消息以及PUB/SUB模型

    前言:本文是基于Spring和ActiveMQ的一个示例文章,包括了Point-To-Point的异步队列消息和PUB/SUB(发布/订阅)模型,只是做了比较简单的实现,无任何业务方面的东西,作为一个 ...

  5. Spring Boot:集成Druid数据源

    综合概述 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据 ...

  6. Spring+SpringMVC+MyBatis集成(SSM)

    1.导入需要用到的jar包 <dependencies> <!--Spring核心包--> <dependency> <groupId>org.spri ...

  7. Spring Boot 项目集成 Alibaba Druid

    Druid 是一个非常好用的数据库连接池,但是他的好并不止体现在作为一个连接池加快数据访问性能上和连接管理上,他带有一个强大的监控工具:Druid Monitor.不仅可以监控数据源和慢查询,还可以监 ...

  8. 在spring环境下集成ActiveMQ

    1.参考文献 Spring集成ActiveMQ配置 Spring JMS异步发收消息 ActiveMQ 2.环境 在前面的一篇ActiveMQ入门实例中我们实现了消息的异步传送,这篇博文将如何在spr ...

  9. 【原】Spring与MongoDB集成:配置

    MongoDB的API提供了DBObject接口来实现BSONObject的操作方法,BasicDBObject是具体实现.但是并没有提供DBObject与BeanObject的转换.在还没有了解到与 ...

随机推荐

  1. Django项目部署(阿里云)(1)--基本功能实现

    新博客地址:http://muker.net/django-server.html 手头需要部署一个Django项目,前面的博客也因为偷懒也没有部署,这里记录一下部署过程.ps:其实网上比较靠谱的说明 ...

  2. 折腾 Phalcon 的笔记

    不要用 IIS!Apache 万岁! 不要用 Web Platform Installer!自己动手丰衣足食! 注意版本号.TS 与 NonTS.x86 与 x64 的区别! 关于 Apache 的配 ...

  3. HDU2222 Keywords Search ac自动机第一题

    指针我一般都会出错,所以还是自己写数组版本. In the modern time, Search engine came into the life of everybody like Google ...

  4. BZOJ4399 魔法少女LJJ【线段树合并】【并查集】

    Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅 ...

  5. BZOJ3786 星系探索 【Splay维护dfs序】*

    BZOJ3786 星系探索 Description 物理学家小C的研究正遇到某个瓶颈. 他正在研究的是一个星系,这个星系中有n个星球,其中有一个主星球(方便起见我们默认其为1号星球),其余的所有星球均 ...

  6. ssh/scp免密码登录传输

    # 本地服务器生成key(直接回车默认) ssh-keygen # 将key传输到要登录的服务器 ssh-copy-id -i /root/.ssh/id_rsa.pub root@IP地址 # 输入 ...

  7. WPF/UWP 绑定中的 UpdateSourceTrigger

    在开发 markdown-mail 时遇到了一些诡异的情况.代码是这么写的: <TextBox Text="{Binding Text, Mode=TwoWay}"/> ...

  8. 《DSP using MATLAB》示例Example 6.20

  9. quick code ide设置分辨率

    默认是640*960的分辨率,但是我的设计分辨率是480*800 所以得改改 在config.lua里的改成 -- design resolutionCONFIG_SCREEN_WIDTH = 480 ...

  10. 数据库视图View的使用

    一.视图的概念: 概念: 视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据 ...