Android上的日志
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上的日志的更多相关文章
- android app崩溃日志收集以及上传
源代码获取请到github:https://github.com/DrJia/AndroidLogCollector 已经做成sdk的形式,源代码已公开,源代码看不懂的请自行google. 假设想定制 ...
- Android开发调试日志工具类[支持保存到SD卡]
直接上代码: package com.example.callstatus; import java.io.File; import java.io.FileWriter; import java.i ...
- 警惕rapidxml的陷阱(二):在Android上默认内存池分配数组过大,容易导致栈溢出
上一篇随笔中提到了,rapidxml在每个xml对象中维护了一个内存池,自己管理变量的生存周期.看起来很好,但我们在实际使用中还是出现了问题. 项目中我们的模块很快写好了,在windows和linux ...
- Unity-使用UnityRemote调试手机Android Studio打印日志
抛出问题: 1.Unity调试Android的时候默认情况是build打包成apk,安装到手机运行,调试起来很不方便,如何快速在手机上运行呢? 2.如何像unity的console一样在andro ...
- xutils工具上传日志文件--后台服务器的搭建
在上一篇文章中使用xutils将手机上保存的日志上传到后台服务器中,现在我们来讲后台服务器是如何搭建的 后台服务器采用jsp+sevlet+mysql的框架 首先讲mysql数据库的表的建立 在fil ...
- 使用 Android Studio 的日志工具 Log
•Log简介 Android中的日志工具类是Log,这个类中提供了5个方法来供我们打印日志: 1. $Log.v()$ 用于打印那些最为琐碎的,意义最小的日志信息 对应级别 verbose,是 And ...
- 通杀所有系统的硬件漏洞?聊一聊Drammer,Android上的RowHammer攻击
通杀所有系统的硬件漏洞?聊一聊Drammer,Android上的RowHammer攻击 大家肯定知道前几天刚爆出来一个linux内核(Android也用的linux内核)的dirtycow漏洞.此洞可 ...
- 在Android上使用qemu-user运行可执行文件
在Android上使用qemu-user运行可执行文件 作者:寻禹@阿里聚安全 前言 QEMU简要介绍: QEMU可以解释执行可执行程序.既然QEMU可以解释执行可执行程序,那么QEMU就能够知道执行 ...
- 编译可在Android上运行的qemu user mode
前言 本文在Ubuntu 64位系统上对qemu项目进行交叉编译,并且只编译与qemu user mode有关的代码. 下文中的”NDK”若无特殊说明均指”Android NDK”. 下文中”$NDK ...
- 系列篇|编译可在Android上运行的依赖库(一):glib库
前言 这是系列文章,它们由<编译可在Android上运行的glib库>及其他4篇文章组成,这4篇文章在“编译依赖库”一节中列出.由于glib库依赖于其他第三方库,所以需要先将依赖的第三方库 ...
随机推荐
- WebApi的输出结果重写 OnActionExecuted
public override void OnActionExecuted(ActionExecutedContext context) { if (context.Exception != null ...
- [转帖]Oracle中有大量的sniped会话
https://www.cnblogs.com/abclife/p/15699959.html 1 2 3 4 5 6 7 SQL> select status ,count(*) from g ...
- [转帖]麒麟v10上部署TiDBv5.1.2生产环境的最佳实践
https://tidb.net/book/tidb-monthly/2022/2022-07/usercase/tidb-v5-1-2 前言 笔者最近在一个银行项目中做 PoC 测试,由于客户选择 ...
- [转帖]TiDB 数据库核心原理与架构 [TiDB v6](101)笔记
https://www.jianshu.com/p/01e49a93f671 description: "本课程专为将在工作中使用 TiDB 数据库的开发人员.DBA 和架构师设计. 本门课 ...
- [转帖]Kubernetes部署Minio集群存储的选择,使用DirectPV CSI作为分布式存储的最佳实践
Kubernetes部署Minio集群存储的选择,使用DirectPV CSI作为分布式存储的最佳实践 个人理解浅谈 1. 关于在kubernetes上部署分布式存储服务,K8s存储的选择 非云环境部 ...
- [转帖]JMeter压测Redis
https://www.cnblogs.com/yjlch1016/p/14052402.html 一.Redis Data Set插件: https://jmeter-plugins.org/wik ...
- [转帖]优化命令之iotop命令
文章目录 引言 一.iotop简介 1.iotop安装 2.iotop语法 3.iotop参数 二.I/O的常用快捷键 三.交互模式 四.iotop示例 1.只显示正在产生I/O的进程 2.显示指定P ...
- [转帖]yum 下载全量依赖 rpm 包及离线安装(终极解决方案)
简介 通常生产环境由于安全原因都无法访问互联网.此时就需要进行离线安装,主要有两种方式:源码编译.rpm包安装.源码编译耗费时间长且缺乏编译环境,所以一般都选择使用离线 rpm 包安装. 验证环境 C ...
- nginx 进行目录浏览的简单配置
1. 公司网络安全不让用vsftpd的匿名网络访问了, 没办法 只能够使用 nginx 通过http协议来处理. 2. 最简单的办法就是另外开一个nginx进程简单设置一下nginx的配置文件 wor ...
- 隐私计算之多方安全计算(MPC,Secure Multi-Party Computation)
作者:京东科技隐私计算产品部 杨博 1.背景 如今,组织在收集.存储敏感的个人信息以及在外部环境(例如云)中处理.共享个人信息时, 越来越关注数据安全.这是遵守隐私法规的强需求:例如美国加利福尼亚 ...