为什么使用 slf4j + logback

  logbak定位于log4j的替代者,logback同样支持slf4j,方便被替换。在Android平台上,我在使用log4中遇到tag混乱的问题。相比log4j,logback-android的jar更小巧。

下载jar包

  前往 https://github.com/tony19/logback-android ,下载获得 logback-android-1.1.1-4.jar  slf4j-api-1.7.6.jar

导入到工程中

  将上面的两个jar文件放入项目中的libs中,并添加项目引用。

配置日志文件的位置

  注意下面代码中的  configureLogbackDirectly 方法,它接收一个文件路径参数,指示存放日志文件的目录,还有一个是生成的日志文件的前缀。我下面配置了“每天生成一个新的日志文件”。

  


package vir56k.logdemo;

import android.os.Environment;
import org.slf4j.LoggerFactory;
import java.io.File;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.android.LogcatAppender;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy; /**
* Created by zhangyunfei on 15/9/21.
*/
public class LogConfigurator {
public static void confifure() {
final String LOG_DIR = Environment.getExternalStorageDirectory() + File.separator + "logback";
final String PREFIX = "log";
configureLogbackDirectly(LOG_DIR, PREFIX);
} private static void configureLogbackDirectly(String log_dir, String filePrefix) {
// reset the default context (which may already have been initialized)
// since we want to reconfigure it
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
context.reset(); RollingFileAppender<ILoggingEvent> rollingFileAppender = new RollingFileAppender<ILoggingEvent>();
rollingFileAppender.setAppend(true);
rollingFileAppender.setContext(context); // OPTIONAL: Set an active log file (separate from the rollover files).
// If rollingPolicy.fileNamePattern already set, you don't need this.
//rollingFileAppender.setFile(LOG_DIR + "/log.txt"); TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new TimeBasedRollingPolicy<ILoggingEvent>();
rollingPolicy.setFileNamePattern(log_dir + "/" + filePrefix + "_%d{yyyyMMdd}.txt");
rollingPolicy.setMaxHistory(7);
rollingPolicy.setParent(rollingFileAppender); // parent and context required!
rollingPolicy.setContext(context);
rollingPolicy.start(); rollingFileAppender.setRollingPolicy(rollingPolicy); PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setPattern("%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n");
encoder.setContext(context);
encoder.start(); rollingFileAppender.setEncoder(encoder);
rollingFileAppender.start(); LogcatAppender logcatAppender = new LogcatAppender();
logcatAppender.setContext(context);
logcatAppender.setEncoder(encoder);
logcatAppender.setName("logcat1");
logcatAppender.start(); // add the newly created appenders to the root logger;
// qualify Logger to disambiguate from org.slf4j.Logger
ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
root.setLevel(Level.TRACE);
root.addAppender(rollingFileAppender);
root.addAppender(logcatAppender); // print any status messages (warnings, etc) encountered in logback config
//StatusPrinter.print(context);
} }
 

使用方法

  先声明和创建实例

  private static final Logger logger = LoggerFactory.getLogger(MainActivity.class); 
  
  写入日志  
  logger.debug("debug Some log message. Details: {}", "debug 输出");
  logger.info("info Some log message. Details: {}", "debug 输出");
  logger.error("error Some log message. Details: {}", "debug 输出");

代码混淆注意

  请在你的混淆设置里加入下面这些:

  -keep class ch.qos.** { *; }
  -keep class org.slf4j.** { *; }
  -keepattributes *Annotation*

我写的示例下载地址

  https://github.com/vir56k/demo/tree/master/logBackDemo

参考资料:

https://github.com/tony19/logback-android

https://github.com/tony19/logback-android/wiki/Appender-Notes

http://logback.qos.ch/documentation.html

http://blog.csdn.net/zgmzyr/article/details/8267072

  

在android中使用logback-android日志框架配置 slf4j + logback的更多相关文章

  1. SLF4J其实只是一个门面服务而已,他并不是真正的日志框架,真正的日志的输出相关的实现还是要依赖Log4j、logback等日志框架的。

    小结: 1.加层: 每一种日志框架都有自己单独的API,要使用对应的框架就要使用其对应的API,这就大大的增加应用程序代码对于日志框架的耦合性. 为了解决这个问题,就是在日志框架和应用程序之间架设一个 ...

  2. tomcat日志及logback相关日志框架

    一.重点问题整理 1.1 关于logback.xml中的路径设置问题 准备金系统的logback.xml中设置的路径是: <!-- 定义日志文件 输出位置 --> <property ...

  3. Spring Boot干货系列:(七)默认日志框架配置

    Spring Boot干货系列:(七)默认日志框架配置 原创 2017-04-05 嘟嘟MD 嘟爷java超神学堂 前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候, ...

  4. Springboot入门-日志框架配置(转载)

    默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台. Logback是log4j框架的作者开发的新一代日志框架,它效率更高.能够适应诸多的运行环境,同时天然支 ...

  5. springboot日志框架学习------slf4j和log4j2

    springboot日志框架学习------slf4j和log4j2 日志框架的作用,日志框架就是用来记录系统的一些行为的,可以通过日志发现一些问题,在出现问题之后日志是好的一个帮手. 市面上的日志框 ...

  6. slf4j/logback: logging日志的配置

    slf4j/logback: logging日志的配置 import依赖: import org.slf4j.Logger;import org.slf4j.LoggerFactory;private ...

  7. Android中常用的优秀开源框架

    Android开源框架库分类,挑选出最常用,最实用的开源项目,本篇主要介绍的是优秀开源框架库和项目,UI个性化控件会独立介绍.UI个性化控件 Index Dependency Injections A ...

  8. Android多媒体开发-- android中OpenMax的实现整体框架

    1.android中用openmax来干啥? android中的AwesomePlayer就 是用openmax来做(code)编解码,其实在openmax接口设计中,他不光能用来当编解码.通过他的组 ...

  9. Android中Universal Image Loader开源框架的简单使用

    UIL (Universal Image Loader)aims to provide a powerful, flexible and highly customizable instrument ...

随机推荐

  1. SeqGAN 原理简述

    1. 背景GAN在之前发的文章里已经说过了,虽然现在GAN的变种越来越多,用途广泛,但是它们的对抗思想都是没有变化的.简单来说,就是在生成的过程中加入一个可以鉴别真实数据和生成数据的鉴别器,使生成器G ...

  2. bat 批处理脚本定时执行命令

    有个需求,需要每天定时执行下某个任务,一天一次.由于工作机器环境问题,没有办法设置windows 定时任务.查找资料并完成如下脚本. 功能:每天定时执行一次任务. 复制如下脚本,到一个test.vbs ...

  3. mysql打开binlog

    修改mysql的配置文件,ubuntu下mysql的配置文件存放位置为:/etc/mysql/my.cnf 找到log_bin配置项,指定一个路径: 重启数据库:/etc/init.d/mysql r ...

  4. JAVA中如何正确的用String转Date

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Date date = sdf.parse( ...

  5. poj 1868 Antiarithmetic? 推断序列中是否有等差子序列

    #include<iostream> using namespace std; const int maxN=10024; int n,vis[maxN],a[maxN]; bool fi ...

  6. android studio - No compatible file types found

    今天在使用AS新建一个C++类时候,输完了类名,对话框却显示下面的提示,一直不知道为什么 [解决方案] 在app目录下的build.gradle文件中添加下列代码: externalNativeBui ...

  7. C++中的static 成员变量的一些注意点

    C++中的static成员变量主要用来为多个对象共享数据 例: #include <iostream> using namespace std; class Student{ public ...

  8. Fluent 18.0新功能之:其他

    ANSYS 18.0在2017年1月底发布,来看看Fluent18.0更新了哪些内容. 1 用户界面 关于用户界面方面的更新包括: (1)可以在树形菜单中同时选择多个子节点,如同时选择多个边界,点击右 ...

  9. 定期批量修改远程服务器root密码

    一.背景 很多时候运维或安全工作人员需要维护大量的服务器,其中就包括判断是否存在root弱口令, 如果服务器数量很多一一修改的话的确是要好花费不少时间精力的.如果通过脚本来实现密码更改, 再做一个定期 ...

  10. Burpsuite如何抓取使用了SSL或TLS传输的 IOS App流量

    之前一篇文章介绍了Burpsuite如何抓取使用了SSL或TLS传输的Android App流量,那么IOS中APP如何抓取HTTPS流量呢, 套路基本上与android相同,唯一不同的是将证书导入i ...