专栏首页写代码和思考在Android中使用logback-android日志框架配置 slf4j + logback

在Android中使用logback-android日志框架配置 slf4j + logback

为什么使用 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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • RabbitMQ 学习笔记3 - 使用amqp库连接RabbitMQ

    使用Go 操作RabbitMQ 收发消息,可以 使用Go RabbitMQ客户端库 连接 RabbitMQ 来实现。

    zhangyunfeiVir
  • SpringBoot 中的 Logback 配置:根据环境读取不同配置

    SpringBoot 默认使用 Logback 框架作为日志框架。最近有个想法“由于配置了多环境,比如开发环境,测试环境等,想根据不同环境指定日志文件的存储位置...

    zhangyunfeiVir
  • Go语言基础3 - 函数

    上面的返回值,声明返回的是 int, error 这两个值。在一些需要返回错误信息的情况下会非常有用。

    zhangyunfeiVir
  • 基于 Express 应用框架的技术方案选型浅谈

    现在的 Node 对于前端而言可以涵盖各个方面,包括命令行接口、插件、依赖库、脚手架以及 Web 服务等。本文是一篇对于 Node 使用的浅谈文章,会简单讲解一...

    前端迷
  • 程序员进阶之算法练习(二十七)

    前言 日常练习,保持思考。 正文 1.Parallelogram is Back 题目链接 题目大意: 给出平行四边形的三个点(x[i], y[i]),求出...

    落影
  • ASP.NET Core WEB API 使用element-ui文件上传组件el-upload执行手动文件文件,并在文件上传后清空文件

      从开始学习Vue到使用element-ui-admin已经有将近快两年的时间了,在之前的开发中使用element-ui上传组件el-upload都是直接使用...

    追逐时光
  • Linux内核中的printf实现

    参数中明显采用了可变参数的定义,而在main.c函数的后面直接调用了printf函数,我们可以看下printf函数的参数是如何使用的。

    范蠡
  • Python爬虫进阶必备 | 某小说(XX猫)网站加密分析

    aHR0cHM6Ly93d3cuY2l3ZWltYW8uY29tL2NoYXB0ZXIvMTAzNTQzODcy

    咸鱼学Python
  • Tomcat的设置HTTP页面自动跳转到HTTPS

    HTTP转换到HTTPS常见的解决方案是部署SSL证书来升级。只有正确部署了SSL证书才能使用安全的HTTPS。但有时候,客户端使用HTTP进行访问时,HTTP...

    企鹅号小编
  • python pyppeteer使用笔记

    pyppeteer -- python版本的puppeteer,一个强大的chronium headless浏览器API

    py3study

扫码关注云+社区

领取腾讯云代金券