Giter Site home page Giter Site logo

pqpo / log4a Goto Github PK

View Code? Open in Web Editor NEW
970.0 970.0 134.0 10.15 MB

:octocat:Log4a is an mmap based, high-performance, highly available Android log collection library / Log4a 是一个基于 mmap, 高性能、高可用的 Android 日志收集框架

Home Page: https://pqpo.me/2018/01/17/log4a-principle-analysis/

License: Apache License 2.0

Java 38.40% CMake 1.58% C++ 32.30% Python 0.45% Objective-C 22.04% Objective-C++ 5.22%

log4a's People

Contributors

coneboy-k avatar pqpo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

log4a's Issues

mmap依然是延迟写入机制

mmap也是与标准IO一样的延迟写入机制,README文档中的这段描述应该是有问题的:日志首先会写入到 mmap 文件映射内存中,基于 mmap 的特性,即使用户强杀了进程,日志文件也不会丢失。

性能比较

华为手机测试发现:log4a spend:35ms
file log(no buffer in thread) spend:22ms.
结果似乎FileoutputStream性能不比mmep差,当然需要开启一个线程。能解释是为什么吗

async_flush 导致日志丢失,建议新增同步的 flush 方法

导致日志丢失的复现步骤(大约 10% 的概率):

在自定义的 applicationonTerminate() 生命周期中,调用 flush() 方法,然后底层是调用的 async_flush 去刷新数据的,因为 onTerminate() 之后,app会很快的退出,导致这个异步没有成功的 flush,所以日志文件很大概率丢失。

作者在自己的博客文章中也提到了这种可能性

良秋2018-08-21 16:24
如果请求AsyncFileFlush异步写到log_file的时候,进程被杀,是不是就丢了日志


pqpo2018-08-21 16:32回复
理论上是的,但是在缓存不是特别大的情况下写入是毫秒级的,丢日志的概率极小。
如果要优化的话在实现上得开辟更大的缓存,比如缓存扩大一倍,在写满一半的时候,开始写入前一半的缓存,但是不删除,等确保写入成功之后再标记删除缓存。
这样在实现复杂度上也会增大很多。

建议新增同步的flush 方法

原因:

如果 app ERROR,肯定会产生大量异常日志,这时候会触发 buffer 写满,然后内部调用 async_flush ,而 app error 以后,又会很快的结束进程。这时候就会和上面说的一样,没有成功 flush 导致日志丢失。而 error 日志恰巧是最需要保存的。

如果新增 同步的 flush ,在error 捕获类中,flush 后再 kill 进程,则不会有这种问题

以上

关于LogBuffer::append的疑问

size_t LogBuffer::append(const char *log) {
    std::lock_guard<std::recursive_mutex> lck_append(log_mtx);
    size_t len = strlen(log);
    //剩下的buffer大小
    size_t freeSize = emptySize();
    //写入的大小
    size_t writeSize = len <= freeSize ? len : freeSize;
    //从ptr() + offset开始 写入writeSize大小log 那如果len很长 那截取剩下的log去哪了??会有丢日志问题?
    memcpy(ptr() + offset, log, writeSize);
    //更新offset 下次使用
    offset += writeSize;
    return writeSize;
}

新手,不知道理解的对不对,还请指教,谢谢

集成报错

按照readme集成到Android项目中报错:
04-19 15:40:13.517 12844 12844 F DEBUG : Abort message: 'java_vm_ext.cc:534] JNI DETECTED ERROR IN APPLICATION: JNI NewGlobalRef called with pending exception java.lang.NoSuchMethodError: no static or non-static method "Lme/pqpo/librarylog4a/LogBuffer;.flushAsyncNative(J)V"'

请问一下 大概是什么问题呢 谢谢

some suggestions

  1. 增加日志开始记录的头信息,可以区分app的每一次启动
  2. 日志文件里时间增加毫秒和时区信息
  3. 注意避免日志文件所占空间太大造成磁盘空间不足
  4. 过大的日志文件分多个文件存储
  5. 如果增加日志的阅读体验就更好了

some suggestions

  1. 增加日志开始记录的头信息,可以区分app的每一次启动
  2. 日志文件里时间增加毫秒和时区信息
    2.注意避免日志文件所占空间太大造成磁盘空间不足
    3.过大的日志文件分多个文件存储
    4.如果增加日志的阅读体验就更好了

非常强大

但是希望更新以后文档可以修改一下。
eg:问一下这个日志文件大小可以设置么?是永久存在本地还是会定期删除?

日志完整性

求问:
//在应用退出的时候刷新缓存
Log4a.flush();
//如果想要释放内存可以调用下面的方法,内部会调用刷新,下次使用需要重新初始化
Log4a.release();
这两个是必须调用的吗?
如果我在调用这两个之前就被系统杀掉,或者是被用户自己手动杀掉还会完整保存日志吗?

偶尔会有日志没有写入的问题

几率好像也不小,主要是线上用户发生,会出现日志文件内容只有数条的情况,其他日志全部丢失。
在一个用户日志中,发现一个这样的情况,第一个日志内容丢失,第二个日志完整。
我在初始化日志的时候做了检查,在第二个日志文件初始化的时候没有检查出第一个日志的存在,但实际收取用户日志的时候存在两个日志文件,第一个和第二个日志,估计是LogBuffer有问题,第一次启动没写出日志来,然后第二次启动的时候又把之前mmap内的内容刷新出来,形成了第一个残缺日志。
目前没有解决方法,可能要修改优化该库cpp才能解决

小小建议

如果日志名字是按照日期命名的,每次启动会重新生成一个新的日志文件,如果进程被强杀,再恢复上次的日志信息,都是在新建的日志文件里面的,按照我的想法是追加在上次保存文件后面的。

最后:我能集成到我们项目中应用吗?不会承担啥法律责任吧,—___—……

使用过程中有日志丢失的情况

我项目中使用该日志已经有一段时间了,但是今天发现了一次日志丢失的情况。在某台设备中的昨天的日志中,时间戳只有到22:20分,到24点之间的日志没有了。而且这台设备不会在这个时间不会存在重启或者app被强行杀死的情况。请问日志丢失的问题出在哪里?

windows 10 源码编译失败

使用了android-ndk-r11candroid-ndk-r14b都试过,编译的时候出错

Build command failed.


Error while executing process D:\Android\Sdk\cmake\3.6.4111459\bin\cmake.exe with arguments {-HE:\AndroidProjects\Log4a-master\librarylog4a -BE:\AndroidProjects\Log4a-master\librarylog4a\.externalNativeBuild\cmake\debug\x86 -DANDROID_ABI=x86 -DANDROID_PLATFORM=android-14 -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=E:\AndroidProjects\Log4a-master\librarylog4a\build\intermediates\cmake\debug\obj\x86 -DCMAKE_BUILD_TYPE=Debug -DANDROID_NDK=E:\NDK\android-ndk-r14b -DCMAKE_CXX_FLAGS=-std=c++11 -frtti -fexceptions -lz -DCMAKE_TOOLCHAIN_FILE=E:\NDK\android-ndk-r14b\build\cmake\android.toolchain.cmake -DCMAKE_MAKE_PROGRAM=D:\Android\Sdk\cmake\3.6.4111459\bin\ninja.exe -GAndroid Gradle - Ninja}


-- Check for working C compiler: E:/NDK/android-ndk-r14b/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe


-- Check for working C compiler: E:/NDK/android-ndk-r14b/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe -- works


-- Detecting C compiler ABI info


-- Detecting C compiler ABI info - done


-- Detecting C compile features


-- Detecting C compile features - done


-- Check for working CXX compiler: E:/NDK/android-ndk-r14b/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe


-- Check for working CXX compiler: E:/NDK/android-ndk-r14b/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe -- works


-- Detecting CXX compiler ABI info


-- Detecting CXX compiler ABI info - done


-- Detecting CXX compile features


-- Detecting CXX compile features - done


CMake Error at CMakeLists.txt:34 (target_link_libraries):


-- Configuring incomplete, errors occurred!


See also "E:/AndroidProjects/Log4a-master/librarylog4a/.externalNativeBuild/cmake/debug/x86/CMakeFiles/CMakeOutput.log".


Build command failed.


Error while executing process D:\Android\Sdk\cmake\3.6.4111459\bin\cmake.exe with arguments {-HE:\AndroidProjects\Log4a-master\librarylog4a -BE:\AndroidProjects\Log4a-master\librarylog4a\.externalNativeBuild\cmake\release\x86 -DANDROID_ABI=x86 -DANDROID_PLATFORM=android-14 -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=E:\AndroidProjects\Log4a-master\librarylog4a\build\intermediates\cmake\release\obj\x86 -DCMAKE_BUILD_TYPE=Release -DANDROID_NDK=E:\NDK\android-ndk-r14b -DCMAKE_CXX_FLAGS=-std=c++11 -frtti -fexceptions -lz -DCMAKE_TOOLCHAIN_FILE=E:\NDK\android-ndk-r14b\build\cmake\android.toolchain.cmake -DCMAKE_MAKE_PROGRAM=D:\Android\Sdk\cmake\3.6.4111459\bin\ninja.exe -GAndroid Gradle - Ninja}


-- Check for working C compiler: E:/NDK/android-ndk-r14b/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe


-- Check for working C compiler: E:/NDK/android-ndk-r14b/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe -- works


-- Detecting C compiler ABI info


-- Detecting C compiler ABI info - done


-- Detecting C compile features


-- Detecting C compile features - done


-- Check for working CXX compiler: E:/NDK/android-ndk-r14b/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe


-- Check for working CXX compiler: E:/NDK/android-ndk-r14b/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe -- works


-- Detecting CXX compiler ABI info


-- Detecting CXX compiler ABI info - done


-- Detecting CXX compile features


-- Detecting CXX compile features - done


CMake Error at CMakeLists.txt:34 (target_link_libraries):


-- Configuring incomplete, errors occurred!


See also "E:/AndroidProjects/Log4a-master/librarylog4a/.externalNativeBuild/cmake/release/x86/CMakeFiles/CMakeOutput.log".


更新:2018/10/19 没法编译 使用了最新的NDK库,把'armeabi' ,'mips' 支持去掉就可以了
但是不知道只生成了armeabi-v7a的so包,x86的文件夹为什么没有so文件 因为我是debug模式,所以只生成了该手机的so文件.

本来想用的,但是..

哈哈标题党了(x
本来看非常不错,正合我需要,但是发现有 native,就放弃了,嫌 native 太大..
我不懂 native,有没有不需要 native 的方法呢..

同道中人哈

我之前也为我公司封装过高性能日志,也是结合了 marx 的 xlog,不过我是直接用的 xlog 编译出来的 .so库,然后结合我的 alog,仅仅在写入文件部分使用到了 xlog 的代码,公司也一直在用我封装的 Lg,哈哈。

so文件为什么这么大?

以1.3.0版本的release目录下的armeabi架构来看,so文件有133K。
是有相关编译选项没有设置么,看代码不应该这么大啊。。。

内存写坏了?

Build fingerprint: 'Xiaomi/markw/markw:6.0.1/MMB29M/8.1.4:user/release-keys'
Revision: '0'
ABI: 'arm'
pid: 29161, tid: 29161, name: xxx >>> xxxx <<<
signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0xf412e000
r0 f412d005 r1 f412e000 r2 70795464 r3 6e273d65
r4 ffb0e9c8 r5 f412d005 r6 ab33da20 r7 ffb0e990
r8 ab339670 r9 00001000 sl 00000022 fp 00001000
ip 00000000 sp ffb0e988 lr dfb3c5f7 pc f7328ff8 cpsr 600d0030

backtrace:
#00 pc 00017ff8 /system/lib/libc.so (strlen+71)
#1 pc 000095f3 /data/app/xxx/lib/arm/liblog4a-lib.so (_ZN9LogBufferC1EPcj+38)
#2 pc 0000939d /data/app/xxx/lib/arm/liblog4a-lib.so
#3 pc 000ea9c9 /system/lib/libart.so (art_quick_generic_jni_trampoline+40)
#4 pc 000e62d1 /system/lib/libart.so (art_quick_invoke_stub_internal+64)
#5 pc 003eb9c5 /system/lib/libart.so (art_quick_invoke_static_stub+172)
#6 pc 007fac2c [stack]

Seek help - About use

  1. compile 'com.github.pqpo:Log4a:{last-version}'
    What is the last-version ?
  2. init log4a: “new Logger.Builder()” ,no Builder in Logger.
    The init code:
    Logger logger = new Logger.Builder()
    .enableAndroidAppender(androidBuild)
    .enableFileAppender(fileBuild)
    .create();

Log4a.setLogger(logger);

mail: [email protected]

线上崩溃

java:
me.pqpo.librarylog4a.LogBuffer.write(LogBuffer.java:2)
me.pqpo.librarylog4a.appender.AbsAppender.appendInner(AbsAppender.java:2)
me.pqpo.librarylog4a.appender.AbsAppender.append(AbsAppender.java:4)
me.pqpo.librarylog4a.logger.AppenderLogger.println(AppenderLogger.java:3)
me.pqpo.librarylog4a.Log4a.println(Log4a.java:2)
me.pqpo.librarylog4a.Log4a.i(Log4a.java:1)

写脏数据时偶尔失败

异步写脏数据时,因文件被关闭导致写文件失败。
关闭文件操作是在LogBuffer被析构时关闭的

使用Log4a后cpu性能变差了?

我原本使用的是安卓原生Log和FileOutputStream(with no buffer)结合输出到logcat和文件,换成Log4a的FileAppender和AndroidAppender后cpu占用率反而提高了2%?请问高性能的体现何在?是我哪里使用错了吗?

            final boolean isRelease = "release".equalsIgnoreCase(BuildConfig.BUILD_TYPE);
            AndroidAppender androidAppender = new AndroidAppender.Builder().addInterceptor(new Interceptor() {
                @Override
                public boolean intercept(LogData logData) {
                    if (isRelease && logData.logLevel <= Level.INFO) {
                        return false;
                    }
                    return true;
                }
            }).create();
            FileAppender fileAppender = new FileAppender.Builder(mContext)
                .setLogFilePath(file.getAbsolutePath())
                .create();
            AppenderLogger logger = new AppenderLogger.Builder()
                .addAppender(fileAppender)
                .addAppender(androidAppender)
                .create();

            Log4a.setLogger(logger);

log4a_sample_v1.1.0.apk 的源码可以提供吗?这个demo之所以数据这么好看,是不是因为没有调用log4a的文件输出api(即FileAppender)呢?

多进程支持吗?

同一个APP中有多个进程,但只能有一个目标日志文件,可以支持吗?即
存在不同进程的不同线程同时写入一个目标日志文件的并发情况,会不会发生数据丢失?

Logger.Builder类找不到

README没有更新吗?
怎么个用法啊
Logger logger = new Logger.Builder()
.enableAndroidAppender(androidBuild)
.enableFileAppender(fileBuild)
.create();

依赖失效

v1.4.2依赖不下来,jitpack仓库上看到是失效了

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.