Android的日志机制和普通的Java项目有一些不一样, 这里记录一下

安卓内建的Log

安卓应用类型(在build.gradle里定义 android {...})的模块, 可以直接引用内建的android.util.Log, 这是最常用的日志机制, 和服务器端开发的区别在于, 内建的Log需要一个TAG, 这个TAG用于在控制台过滤日志, 一般使用类名. 日志级别从verbose开始, 分为 v, d, i, w, e. 其中, v不应该被编译进入发布版本, d会被编译但是会在运行时去掉. 长度大于23个字符的TAG在Logcat输出中会被截断. 如果需要对某个TAG设置单独的日志级别, 需要通过setprop设置

setprop log.tag.<YOUR_LOG_TAG> <LEVEL>
# 例如
adb shell setprop log.tag.MainActivity VERBOSE

如果需要写入文件, 不能在android.util.Log的基础上实现, 需要自己实现一个Log类.

使用slf4j + Logback classic

对于非安卓应用模式的模块, 例如Java/Kotlin Library, 无法直接使用安卓内建Log, 可以使用slf4j. 网络上可以找到的android slf4j变体很多, 但是经典的org.slf4j:slf-api还是可用的, 需要在build.gradle添加dependency, 这里使用了和服务器环境一样的ch.qos.logback. logback-core会被logback-classic引用加入, 可以不写在dependencies里面.

dependencies {
...
implementation 'org.slf4j:slf4j-api:1.7.25'
implementation 'ch.qos.logback:logback-classic:1.2.3'
...
}

添加上门的dependency之后, 就可以在代码中输出日志, 这个输出对于logcat, 和命令行执行main()方法都是有效的.

private static final Logger Log = LoggerFactory.getLogger(NetworkUtil.class);
...
Log.error(e.getMessage(), e);
...

使用slf4j + tony19:logback-android

在Java/Kotlin Library的build.gradle中只添加slf4j, 在app module的build.gradle中添加tony19:logback-android

dependencies {
...
implementation 'com.github.tony19:logback-android:2.0.0'
...

然后在app module中, 与main和res目录平级添加assets目录, 添加logback.xml, 写入

<configuration>
<appender name="logcat" class="ch.qos.logback.classic.android.LogcatAppender">
<tagEncoder>
<pattern>%logger{12}</pattern>
</tagEncoder>
<encoder>
<pattern>[%-20thread] %msg</pattern>
</encoder>
</appender> <root level="DEBUG">
<appender-ref ref="logcat" />
</root>
</configuration>

这样就可以在运行app时, 使用slf4j输出日志.

注意: assets/logback.xml 这个文件是必须的, 如果没有找到配置文件, tony19:logback-android不会输出任何日志.

logback-classic 与 logback-android 并存

如果在lib中只添加slf4j, 在运行main()时会报错 SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
如果在lib中添加tony19:logback-android, 依然会报上面的错误
如果在lib中添加logback-classic, 运行main()会正常输出日志, 但是在编译app时, 会提示"Duplicate class ch.qos.logback.classic"

这是因为这两个logback实现类产生了冲突, 需要在app的build.gradle中配置排除lib引入的logback-classic, 添加

android {
... configurations {
all {
exclude group: 'ch.qos.logback', module: 'logback-classic'
}
}
...

之后就可以正常编译了

Logback-android日志写入文件

使用以下配置, 可以将日志写入文件, 注意这里的文件路径 ${DATA_DIR} 会指向应用在内部存储的目录, 这个不需要读写权限, 并且其他应用无权访问. 对应文件系统中的实际路径为 /storage/emulated/0/com.rockbb.app.pocketserver/files/logs/app.log 或 /data/user/0/com.rockbb.app.pocketserver/files/logs/app.log , 但是如果在<file>中直接指定这个路径, 就需要读写权限.

<configuration>
<!-- Create a file appender for a log in the application's data directory -->
<property name="LOG_HOME" value="${DATA_DIR}" />
<appender name="file" class="ch.qos.logback.core.FileAppender">
<file>${LOG_HOME}/logs/app.log</file>
<encoder>
<tagEncoder>
<pattern>%35.35logger{70}#%4.4line</pattern>
</tagEncoder>
<encoder>
<pattern>%8.8thread %msg%n</pattern>
</encoder>
</encoder>
</appender> <appender name="logcat" class="ch.qos.logback.classic.android.LogcatAppender">
<tagEncoder>
<pattern>%25.25logger{50}#%3.3line</pattern>
</tagEncoder>
<encoder>
<pattern>%8.8thread %msg%n</pattern>
</encoder>
</appender> <root level="DEBUG">
<appender-ref ref="logcat" />
<appender-ref ref="file" />
</root>
</configuration>

需要写入其他公共路径, 需要在AndroidManifest.xml中申请权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

  

Android上的日志的更多相关文章

  1. android app崩溃日志收集以及上传

    源代码获取请到github:https://github.com/DrJia/AndroidLogCollector 已经做成sdk的形式,源代码已公开,源代码看不懂的请自行google. 假设想定制 ...

  2. Android开发调试日志工具类[支持保存到SD卡]

    直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.i ...

  3. 警惕rapidxml的陷阱(二):在Android上默认内存池分配数组过大,容易导致栈溢出

    上一篇随笔中提到了,rapidxml在每个xml对象中维护了一个内存池,自己管理变量的生存周期.看起来很好,但我们在实际使用中还是出现了问题. 项目中我们的模块很快写好了,在windows和linux ...

  4. Unity-使用UnityRemote调试手机Android Studio打印日志

    抛出问题:  1.Unity调试Android的时候默认情况是build打包成apk,安装到手机运行,调试起来很不方便,如何快速在手机上运行呢?  2.如何像unity的console一样在andro ...

  5. xutils工具上传日志文件--后台服务器的搭建

    在上一篇文章中使用xutils将手机上保存的日志上传到后台服务器中,现在我们来讲后台服务器是如何搭建的 后台服务器采用jsp+sevlet+mysql的框架 首先讲mysql数据库的表的建立 在fil ...

  6. 使用 Android Studio 的日志工具 Log

    •Log简介 Android中的日志工具类是Log,这个类中提供了5个方法来供我们打印日志: 1. $Log.v()$ 用于打印那些最为琐碎的,意义最小的日志信息 对应级别 verbose,是 And ...

  7. 通杀所有系统的硬件漏洞?聊一聊Drammer,Android上的RowHammer攻击

    通杀所有系统的硬件漏洞?聊一聊Drammer,Android上的RowHammer攻击 大家肯定知道前几天刚爆出来一个linux内核(Android也用的linux内核)的dirtycow漏洞.此洞可 ...

  8. 在Android上使用qemu-user运行可执行文件

    在Android上使用qemu-user运行可执行文件 作者:寻禹@阿里聚安全 前言 QEMU简要介绍: QEMU可以解释执行可执行程序.既然QEMU可以解释执行可执行程序,那么QEMU就能够知道执行 ...

  9. 编译可在Android上运行的qemu user mode

    前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编译与qemu user mode有关的代码. 下文中的”NDK”若无特殊说明均指”Android NDK”. 下文中”$NDK ...

  10. 系列篇|编译可在Android上运行的依赖库(一):glib库

    前言 这是系列文章,它们由<编译可在Android上运行的glib库>及其他4篇文章组成,这4篇文章在“编译依赖库”一节中列出.由于glib库依赖于其他第三方库,所以需要先将依赖的第三方库 ...

随机推荐

  1. WebApi的输出结果重写 OnActionExecuted

    public override void OnActionExecuted(ActionExecutedContext context) { if (context.Exception != null ...

  2. [转帖]Oracle中有大量的sniped会话

    https://www.cnblogs.com/abclife/p/15699959.html 1 2 3 4 5 6 7 SQL> select status ,count(*) from g ...

  3. [转帖]麒麟v10上部署TiDBv5.1.2生产环境的最佳实践

    https://tidb.net/book/tidb-monthly/2022/2022-07/usercase/tidb-v5-1-2 前言​ 笔者最近在一个银行项目中做 PoC 测试,由于客户选择 ...

  4. [转帖]TiDB 数据库核心原理与架构 [TiDB v6](101)笔记

    https://www.jianshu.com/p/01e49a93f671 description: "本课程专为将在工作中使用 TiDB 数据库的开发人员.DBA 和架构师设计. 本门课 ...

  5. [转帖]Kubernetes部署Minio集群存储的选择,使用DirectPV CSI作为分布式存储的最佳实践

    Kubernetes部署Minio集群存储的选择,使用DirectPV CSI作为分布式存储的最佳实践 个人理解浅谈 1. 关于在kubernetes上部署分布式存储服务,K8s存储的选择 非云环境部 ...

  6. [转帖]JMeter压测Redis

    https://www.cnblogs.com/yjlch1016/p/14052402.html 一.Redis Data Set插件: https://jmeter-plugins.org/wik ...

  7. [转帖]优化命令之iotop命令

    文章目录 引言 一.iotop简介 1.iotop安装 2.iotop语法 3.iotop参数 二.I/O的常用快捷键 三.交互模式 四.iotop示例 1.只显示正在产生I/O的进程 2.显示指定P ...

  8. [转帖]yum 下载全量依赖 rpm 包及离线安装(终极解决方案)

    简介 通常生产环境由于安全原因都无法访问互联网.此时就需要进行离线安装,主要有两种方式:源码编译.rpm包安装.源码编译耗费时间长且缺乏编译环境,所以一般都选择使用离线 rpm 包安装. 验证环境 C ...

  9. nginx 进行目录浏览的简单配置

    1. 公司网络安全不让用vsftpd的匿名网络访问了, 没办法 只能够使用 nginx 通过http协议来处理. 2. 最简单的办法就是另外开一个nginx进程简单设置一下nginx的配置文件 wor ...

  10. 隐私计算之多方安全计算(MPC,Secure Multi-Party Computation)

    作者:京东科技隐私计算产品部 杨博 1.背景 如今,组织在收集.存储敏感的个人信息以及在外部环境(例如云​​)中处理.共享个人信息时, 越来越关注数据安全.这是遵守隐私法规的强需求:例如美国加利福尼亚 ...