Board logo

标题: [文件操作] 【已解决】求助批处理如何用adb logcat自动分段记录日志? [打印本页]

作者: 银八    时间: 7 天前 11:01     标题: 【已解决】求助批处理如何用adb logcat自动分段记录日志?

本帖最后由 银八 于 2024-11-16 23:04 编辑

Origin_MD_Data:JXU4MENDJXU2NjZGJXVGRjFBYWRiJTIwbG9nY2F0JXU2NjJGUEMldThDMDMldThCRDUldTVCODkldTUzNTMldTc2ODQldThCQjAldTVGNTUldTY1RTUldTVGRDcldTc2ODQldTU0N0QldTRFRTQldUZGMEMldTVCODMldTY3MDkldTRFMDAldTRFMkEldTcyNzkldTcwQjkldTY2MkYqKiV1NEUwMCV1NTQyRiV1NTJBOCV1NUMzMSV1NEUwRCV1NEYxQSV1NTA1QyV1NkI2MioqJXVGRjA4JXU5NjY0JXU5NzVFJTYwJTYwJTYwQ3RybCU2MCU2MCU2MCslNjAlNjAlNjBDJTYwJTYwJTYwJXVGRjBDJXU2MjE2JXU4MDA1JXU3MEI5JXU1MUZCJUQ3JTI5JXVGRjBDJXU0RjQ2JXU0RTAwJXU2QjIxJXU2MzAxJXU3RUVEJXU1OTJBJXU0RTQ1JXU3Njg0JXU2MjkzJXU1M0Q2JXU0RjFBJXU1QkZDJXU4MUY0JXU2NUU1JXU1RkQ3JXU2NTg3JXU0RUY2JXU4RkM3JXU1OTI3JXVGRjBDJXU2NUUwJXU2Q0Q1JXU3NTI4JXU4QkIwJXU0RThCJXU2NzJDJXU1NDhDTm90ZXBhZCsrJXU2MjUzJXU1RjAwJXUzMDAyJTBBJTBBJTYwJTYwJTYwYmF0Y2glMEFhZGIlMjBsb2djYXQlMjAlM0UlMjBEJTNBJTVDbG9nY2F0JTVDbG9nXyUyNXRpbWVOb3clMjUudHh0JTBBJTYwJTYwJTYwJTBBLS0tJTIwJTBBJTBBJXU3M0IwJXU1NzI4JXU2MEYzJXU3NTI4JXU0RTAwJXU0RTJBYmF0JXU1NDdEJXU0RUU0JXU1QjlFJXU3M0IwKioldTZCQ0YldTk2OTQzMCV1NTIwNiV1OTQ5RiV1NjI2NyV1ODg0QyV1NEUwMCV1NkIyMSV1NTA1QyV1NkI2MiV1NUU3NiV1NjI5MyV1NTNENiV1NjVCMCV1NjVFNSV1NUZENyoqJXU3Njg0JXU2NENEJXU0RjVDJXVGRjBDJXU1RTBDJXU2NzFCJXU1NDA0JXU0RjREJXU1OTI3JXU0RjZDJXU1RTJFJXU1RkQ5JTBB背景:adb logcat是PC调试安卓的记录日志的命令,它有一个特点是一启动就不会停止(除非Ctrl+C,或者点击×),但一次持续太久的抓取会导致日志文件过大,无法用记事本和Notepad++打开。
  1. adb logcat > D:\logcat\log_%timeNow%.txt
复制代码


现在想用一个bat命令实现每隔30分钟执行一次停止并抓取新日志的操作,希望各位大佬帮忙
作者: flashercs    时间: 7 天前 14:00

这是AI的答案,不知道可行?
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :loop
  4. set timestamp=%date:~-10,2%-%date:~-7,2%-%date:~-4,4%_%time:~0,2%-%time:~3,2%-%time:~6,2%
  5. set log_file=logcat_%timestamp%.txt
  6. echo Starting logcat capture to %log_file%
  7. adb logcat -v time > "%log_file%"
  8. timeout /t 1800 > nul
  9. taskkill /F /IM adb.exe > nul
  10. echo Logcat capture stopped for %log_file%
  11. timeout /t 60 > nul
  12. goto loop
复制代码

作者: 银八    时间: 7 天前 15:32

回复 2# flashercs

执行到第9行时,会一直执行这条命令。
正如背景中介绍的,它不会自己停止,所以无法执行后续timeout指令
作者: 77七    时间: 7 天前 16:32

  1. @echo off
  2. :rec
  3. adb devices | findstr /rec:"device" 1>nul || (echo not connect & timeout 1 & goto :rec)
  4. for /f "tokens=2" %%a in ('tasklist ^| find "adb.exe"') do (
  5. set _pid=%%a
  6. )
  7. :loop
  8. for /f "delims=" %%a in ('wmic os get localdatetime ^| findstr [0-9]') do (
  9. set t=%%a
  10. )
  11. start /b cmd "/c adb logcat > D:\log_%t:~0,14%.txt"
  12. timeout 3
  13. for /f "tokens=2" %%a in ('tasklist ^| find "adb.exe" ^| find /v " %_pid% "') do (
  14. taskkill /f /pid %%a
  15. )
  16. goto :loop
复制代码

作者: flashercs    时间: 7 天前 17:29

本帖最后由 flashercs 于 2024-11-16 17:31 编辑

按时间不如按记录条数分割文件,如每10000条记录为一个日志:
  1. adb logcat|powershell -c "function New-LogFileName{'D:\logcat\log_'+(Get-Date -Format 'yyyyMMddHHmmss')+'.log';}while(1){$log=New-LogFileName;$input|select -First 10000|set-content -literal $log;}"
复制代码

作者: 银八    时间: 7 天前 22:43

回复 4# 77七


    感谢大佬,这个命令能够实现需要的功能了
  (有两个小问题,一是在缩放cmd窗口或者按下键盘的Win键时会无视计时立即重新开始生成新日志文件
     二是通过杀死adb.exe进程的方式做日志截断的话,可能影响当前其他adb命令的操作)
作者: 银八    时间: 7 天前 22:45

按时间不如按记录条数分割文件,如每10000条记录为一个日志:
flashercs 发表于 2024-11-16 17:29



    原来是用powershell实现的吗,赞!
作者: 银八    时间: 7 天前 23:01

用5楼的代码润色了一下,结果:
  1. @echo off&title 日志分割
  2. set lineLimit=100000
  3. set LogPath=F:\logcat\
  4. if not exist %LogPath% mkdir %LogPath%
  5. adb logcat -c&echo 历史日志已清空
  6. echo.&echo.
  7. echo 日志抓取中,保存路径为%LogPath%……
  8. adb logcat|powershell -c "function New-LogFileName{'%LogPath%log_'+(Get-Date -Format 'yyyyMMddHHmmss')+'.log';}while(1){$log=New-LogFileName;$input|select -First %lineLimit%|set-content -literal $log;}"
复制代码
可以使用啦
作者: 77七    时间: 6 天前 07:26

回复 6# 银八


   
是会存在这两个问题,为了在一个窗口中完成,采用了taskkill的方法

复制一份adb.exe 命名为 adb_2.exe,调用adb_2.exe防止影响其它adb进程
timeout /nobreak 防止误触
即使这样,还会存在一个短暂中断期间日志缺失的问题。




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2