一. LogBack配置

  1. 配置pom.xml

    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.13</version>
    </dependency>
    <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.0.9</version>
    </dependency>
    <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.0.9</version>
    </dependency>
  2. 加入logback.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
    <appender name="all" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>logs/haha.log</file>
    <!--maxHistory或者maxFileSize或者系统重启都会触发归档-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    <fileNamePattern>logs/haha.log_%d{yyyy-MM-dd}_%i.log.zip</fileNamePattern><!--归档文件名,%i是索引,从0开始递增-->
    <maxHistory>5</maxHistory><!--保留5天的日志-->
    <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    <maxFileSize>100</maxFileSize><!--单个文件最大100m,超过此大小就归档,然后重新开一个文件-->
    </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <encoder>
    <pattern>%d [%thread] %level %logger\(line:%line\) - %msg%n</pattern>
    </encoder>
    </appender>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
    <pattern>%d [%thread] %level %logger\(line:%line\) - %msg%n</pattern>
    </encoder>
    </appender>
    <logger name="com" level="DEBUG" additivity="false"><!--此处指定com包下的log级别,additivity="false"指定自己的appender-->
    <appender-ref ref="STDOUT" />
    </logger> <root level="DEBUG"> <!--root的level:代码中log的级别大于此处的level时,才触发appender(全局设置)-->
    <appender-ref ref="STDOUT" />
    </root>
    </configuration>
  3. 用slf4j调用日志打印组件

    (1) slf4j-api这个包调用默认logback的class进行日志打印

    (2)slf4j的LoggerFactory.getlogger(),会生成LogBack的LoggerContext,进行日志打印

  4. 更改logback.xml读取位置

    logback默认读取classpath下的logback.xml, 改变文件位置, 在项目启动时执行配置

    public class LogbackLocation implements InitializingBean {
    
        private Logger logger = LoggerFactory.getLogger("LogbackLocation");
    
        public void afterPropertiesSet() throws Exception {
    new LogBackLocationUtil("etc\\logback.xml").configLogger();
    logger.info("Logger back file success"); }
    }
    public class LogBackLocationUtil {
    
        private String fileLocation;
    private LoggerContext context; public LogBackLocationUtil(String fileLocation) {
    this.fileLocation = fileLocation;
    } public void configLogger( ){
    this.context = (LoggerContext) LoggerFactory.getILoggerFactory();
    JoranConfigurator joranConfigurator = new JoranConfigurator(); joranConfigurator.setContext(this.context);
    InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(this.fileLocation);
    try {
    if(resourceAsStream != null)
    joranConfigurator.doConfigure(resourceAsStream);
    System.out.println("loggerback config file success !!!");
    } catch (JoranException e) {
    e.printStackTrace();
    }
    } public void closeContext(){
    if(this.context != null)
    this.context.stop();
    System.out.println("logback context closed success !!!");
    }
    }

二. 配置p6spy

  1. 添加pom支持

    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.18</version>
    </dependency>
    <dependency>
    <groupId>p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>1.3</version>
    </dependency>
  2. classpath下加入spy.properties

    // p6spy是sqldriver的一种代理,用来获取发往数据库的真是sql,此处要配置真正的数据库代理
    realdriver=com.mysql.jdbc.Driver
    appender=com.mylogger.WithoutResultsetLogger // 自定义sql输出格式(不打印结果集)
  3. 打印格式类

    该类编写参考spy.properties中默认的appender类 (#appender=com.p6spy.engine.logging.appender.Log4jLogger)

    public class WithoutResultsetLogger  extends FormattedLogger implements P6Logger {
    // protected Level level;
    protected String lastEntry;
    private static Logger logger = LoggerFactory.getLogger(WithoutResultsetLogger.class); public WithoutResultsetLogger() {
    P6SpyProperties properties = new P6SpyProperties();
    } public void logException(Exception e) {
    StringWriter sw = new StringWriter();
    PrintWriter pw = new PrintWriter(sw);
    e.printStackTrace(pw);
    this.logText(sw.toString());
    } public void logText(String text) { // 自定义日志输出格式
    if(!text.contains("resultset"))
    logger.debug(text.substring(text.lastIndexOf("|")+1));//(text.substring(text.lastIndexOf("|")+1));
    this.setLastEntry(text);
    } }

一. Logback与p6spy的更多相关文章

  1. 使用p6spy格式化日志输出

    P6Spy 是针对数据库访问操作的动态监测框架(为开源项目,项目首 页:www.p6spy.com)它使得数据库数据可无缝截取和操纵,而不必对现有应用程序的代码作任何修改.P6Spy 分发包包括P6L ...

  2. LogBack简易教程

    1.简介 LogBack是一个日志框架,它与Log4j可以说是同出一源,都出自Ceki Gülcü之手.(log4j的原型是早前由Ceki Gülcü贡献给Apache基金会的) 1.1 LogBac ...

  3. JDBC数据库访问操作的动态监测 之 p6spy

    P6spy是一个JDBC Driver的包装工具,p6spy通过对JDBC Driver的封装以达到对SQL语句的监听和分析,以达到各种目的. P6spy1.3 sf.net http://sourc ...

  4. java日志组件介绍(common-logging,log4j,slf4j,logback )

    转自:http://www.blogjava.net/daiyongzhi/archive/2014/04/13/412364.html common-logging是apache提供的一个通用的日志 ...

  5. logback logback.xml常用配置详解 <filter>

    <filter>: 过滤器,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之一.返回DENY,日志将立即被抛弃不再经过其他过滤器:返回NEUTRAL,有序列表 ...

  6. logback 常用配置详解<appender>

    logback 常用配置详解 <appender> <appender>: <appender>是<configuration>的子节点,是负责写日志的 ...

  7. logback日志写入数据库(mysql)配置

    如题  建议将日志级别设置为ERROR.这样可以避免存储过多的数据到数据中. 1  logback 配置文件(如下) <?xml version="1.0" encoding ...

  8. Logback配置连接

    logback 简介 logback 常用配置详解(一)<configuration> and <logger> logback 常用配置详解(二)<appender&g ...

  9. slf4j log4j logback关系详解和相关用法

    slf4j log4j logback关系详解和相关用法 写java也有一段时间了,一直都有用slf4j log4j输出日志的习惯.但是始终都是抱着"拿来主义"的态度,复制粘贴下配 ...

随机推荐

  1. kafka的推和拉的问题

    之前学习过这一问题,但是面试又被问道了.再次记录下 推还是拉? Kafka最初考虑的问题是,customer应该从brokes拉取消息还是brokers将消息推送到consumer,也就是pull还p ...

  2. spark Streaming的Receiver和Direct的优化对比

    Direct 1.简化并行读取:如果要读取多个partition,不需要创建多个输入DStream然后对它们进行union操作.Spark会创建跟Kafka partition一样多的RDD part ...

  3. svn 安装 、使用(2)

    写在前面的话: p.s.有必要读一读,不然可能会浪费你的时间. 该篇是接着上一篇的,上一篇是看了很多人写的文章,汇总的一些可能的情况,最后还是没有成功.此篇是在一个同学的帮助下成功的,也是在自己做好的 ...

  4. Android多线程入门学习

    (1)进程间通信交换信息的一种方式--使用handler: (2)在主线程中new一个Handler对象,并重写他的handlerMessage(Message msg)方法: (3)Message中 ...

  5. ThinkPHP多表操作

    有以下三张表,分表为pl表(uid,content),user表(id,username),lyb表(uid,title) 多表查询操作有以下几种方法: ㈠视图模型(推荐) 定义视图模型,只需要继承T ...

  6. 【NOIP2010】关押罪犯

    一开始看错题了,然后怎么想都想不明白--原题: S 城现有两座监狱,一共关押着 N 名罪犯,编号分别为 1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲 ...

  7. mysql 查询一条记录的下一条和上一条记录

    如果ID是主键或者有索引,可以直接查找: 方法一: 查询上一条记录的SQL语句(如果有其他的查询条件记得加上other_conditions以免出现不必要的错误): select * from tab ...

  8. Tensorflow 上手——手写数字识别

    下面代码是Tensorflow入门教程中的代码,实现了一个softmax分类器. 第4行是将data文件夹下的mnist数据压缩包读取为tf使用的minibatch字典. 第6-11行定义了所用的变量 ...

  9. linux工具之putty

    http://blog.csdn.net/qk_zhu/article/details/6272247 对于putty,似乎很多人只知道下载回来之后,双击,输入ip,然后登陆使用.其实putty有很多 ...

  10. shell之echo与printf和颜色

    在用户的bashrc中添加一行export来修改提示符.