APP开发实战129-APP Log功能注意事项和Log数据格式化

本文探讨了APP开发中Log功能的两大关键点:注意事项和数据格式化。在注意事项方面,强调了避免使用混淆后的类名作为TAG,以及在串口通讯APP中如何妥善处理log输出。而在Log数据格式化上,推荐了Json格式化库 LoggerKnife 和 KLog,以提升日志阅读的便捷性。

31.2注意事项

1 在设置TAG的值时,最好不要用如下方式:

privatestatic String TAG = MyActivity.class.getSimpleName();

在编译release版本的时候,经过混淆,会把类名变成a\b\c之类的名称,这样就很难通过TAG找到对应的log信息。

 

2 在开发串口通讯的APP时,手机的串口会用于和设备通讯,不能用于ADB功能连接电脑,输出log;这样需要通过提示框或Toast的形式显示log,或把log以文本形式保存在手机中,然后查看此文本文件了解log。

 

3 在开发串口通讯的APP时,手机如果收到对方的信息,通常要在极短的时间内反馈给对方数据,如果输出的log数据过多,可能占用过多系统资源,导致手机不能及时响应接收到的数据,通讯失败。

31.3Log数据的格式化

大部分APP和服务器端传输数据都采用Json格式数据,为了方便查看log数据,可以把Json数据格式化后再输出,可以采用以下两个开源库:

https://github.com/jacksunny/LoggerKnife/

https://github.com/ZhaoKaiQiang/KLog

<think>好的,我现在需要解决用户关于TimedRotatingFileHandler日志名称的问题。用户希望将日志文件从app.log.2024-01-01.log改为app.2024-01-01.log。我需要先理解为什么默认情况下会生成这样的文件名,然后找出修改的方法。 首先,TimedRotatingFileHandler在滚动日志时,默认的命名方式是在原文件名后追加时间戳后缀。例如,如果原始文件是app.log,当进行时间滚动时,会生成类似app.log.2024-01-01这样的文件。不过用户提到的文件名是app.log.2024-01-01.log,这可能是因为在handler的配置中设置了后缀参数,或者系统自动添加了扩展名。 接下来,我需要查看TimedRotatingFileHandler的文档。发现有一个参数suffix,可以自定义时间戳后的后缀。默认情况下,suffix是根据时间轮换的频率自动生成的,比如按天轮换就是"%Y-%m-%d"。不过,用户可能没有正确设置这个参数,或者需要覆盖默认行为。 用户的需求是将app.log改为app.2024-01-01.log。因此,需要将时间戳插入到文件名的主体部分,而不是追加在扩展名之后。这可以通过修改文件名格式来实现,可能需要在创建handler时,将原始文件名设置为app,扩展名在suffix中处理,或者自定义namer函数。 另外,注意到TimedRotatingFileHandler有一个namer属性,可以自定义生成的文件名。但需要注意,namer函数需要处理完整的路径,并返回新的文件名,这可能会影响文件路径的处理。另一种方法是覆盖suffix参数,将整个时间戳后缀作为文件名的一部分。 可能的解决步骤: 1. 将原来的文件名拆分为基本名称扩展名,比如applog。 2. 在创建handler时,设置文件名为基础名称(app.log),然后在suffix中包括日期扩展名,但可能需要自定义suffix的生成方式。 3. 或者,在handler的初始化参数中,通过设置suffix参数,将日期放在文件名中间,扩展名之后。 但TimedRotatingFileHandler的suffix参数默认是根据轮换间隔自动生成的,可能无法直接自定义。因此,可能需要自定义namer函数来修改生成的文件名。 例如,当生成滚动文件时,原文件是app.log,滚动后的文件应该变为app.2024-01-01.log。可以通过将原始文件名分割为basename扩展名,然后拼接日期到basename后面,再加上扩展名。 具体实现: 1. 在创建handler时,设置filename为app.log,这样原始日志文件正确命名。 2. 使用namer函数,在生成滚动文件时,将app.log.2024-01-01重命名为app.2024-01-01.log。这可以通过分割文件名,插入日期部分来实现。 但是,TimedRotatingFileHandler在轮换时,默认会在原始文件名后添加日期后缀,形成类似app.log.2024-01-01的文件名。然后,如果配置了后缀为.log,可能需要调整。但似乎用户的情况中,文件名被附加了两次.log,这可能是因为handler的suffix参数被错误设置,或者在轮换时自动添加了扩展名。 另一种方法是修改suffix参数,将日期格式包含扩展名。例如,设置suffix="%Y-%m-%d.log",这样生成的文件名会是app.log.2024-01-01.log,但这不是用户想要的。所以可能需要自定义处理。 正确的做法是自定义namer函数,将原始文件名中的扩展名分离,把日期插入到主文件名扩展名之间。例如: 原始文件名:app.log 滚动后:app.2024-01-01.log 因此,在namer函数中,可以将文件名分解为basenameext,然后将日期插入其中。例如,对于生成的名称app.log.2024-01-01,将其改为app.2024-01-01.log。 但TimedRotatingFileHandler传递给namer的文件名是默认生成的,比如app.log.2024-01-01,此时需要将其转换为app.2024-01-01.log。这可以通过分割字符串,将日期部分提取出来,并重新组合。 例如: def namer(default_name): base, date_part = default_name.rsplit('.', 2)[0], default_name.split('.')[-1] return f"{base}.{date_part}.log" 但这样的分割可能不够可靠,因为文件名可能包含多个点。更好的方法是使用os.path.splitext来分割主文件名扩展名,但原文件名已经是app.log的情况下,可能需要处理多个扩展名。 或者,将原始文件名视为app.log,在轮换后的文件名中,分割出日期部分,并重组为app.日期.log。 例如,原生成的文件名是app.log.2024-01-01,想要改为app.2024-01-01.log。可以将文件名拆分为app.log2024-01-01,然后将app.log分割成app log,合并成app.2024-01-01.log。 代码实现: import os def custom_namer(default_name): # 分离出基本部分日期部分 base_part, date_part = os.path.splitext(default_name) # base_part是app.log, date_part是.2024-01-01 # 现在将base_part拆分为applog main_name, ext = os.path.splitext(base_part) # main_name是app, ext是.log # 组合成新的文件名:app.2024-01-01.log new_name = f"{main_name}{date_part}{ext}" return new_name 这样,当默认生成的文件名是app.log.2024-01-01时,custom_namer会将其转换为app.2024-01-01.log。 测试这个函数: default_name = "app.log.2024-01-01" base_part, date_part = os.path.splitext(default_name) # base_part是"app.log.2024-01-01", date_part是空?可能不行,因为splittext只分最后一个扩展名。所以这里需要另一种分割方式。 哦,这里有问题,因为os.path.splitext("app.log.2024-01-01")会返回 ("app.log.2024-01-01", ""),因为最后一个后缀不是有效的扩展名。这时候可能需要手动拆分字符串。 另一种方法:假设默认生成的文件名是原文件名加上后缀,如app.log + .2024-01-01 → app.log.2024-01-01。用户希望将其改为app.2024-01-01.log,所以需要将原文件名的扩展名移到日期后缀之后。 所以,原文件名是app.log,生成的滚动文件是app.log.2024-01-01,需要转为app.2024-01-01.log。 所以,处理步骤如下: 1. 将app.log.2024-01-01拆分为app.log2024-01-01。 2. 将app.log拆分为applog。 3. 组合成app.2024-01-01.log。 因此,namer函数可以这样写: def custom_namer(default_name): parts = default_name.split('.') # 原文件名是app.log,滚动后的默认是app.log.2024-01-01 # parts = ['app', 'log', '2024-01-01'] # 我们希望得到app.2024-01-01.log if len(parts) >=3: main = '.'.join(parts[:-2]) # 'app' ext = parts[-2] # 'log' date = parts[-1] # '2024-01-01' new_name = f"{main}.{date}.{ext}" return new_name else: return default_name # 不处理不符合条件的情况 测试这个函数: default_name = "app.log.2024-01-01" parts = default_name.split('.') → ['app', 'log', '2024-01-01'] main = '.'.join(['app']) → 'app' ext = 'log' date = '2024-01-01' new_name → app.2024-01-01.log → 正确。 另一个测试用例:如果原文件名是myapp.log,生成的是myapp.log.2024-01-01,处理后是myapp.2024-01-01.log。 这样看起来可行。但是,如果原文件名中有多个点,比如my.app.log,那么默认生成的滚动文件名是my.app.log.2024-01-01,处理后变成my.app.2024-01-01.log,这可能不是用户想要的。但在这种情况下,用户可能希望保留文件名中的点。不过根据用户的问题,原文件名是app.log,所以这种方法可以解决问题。 然后,在设置handler时,设置namer为这个函数: handler = TimedRotatingFileHandler( filename='app.log', when='midnight', interval=1, backupCount=7, ) handler.namer = custom_namer 这样,当生成滚动文件时,文件名会被正确修改。 需要注意的是,TimedRotatingFileHandler在轮换时会将当前文件关闭,并将当前日志文件重命名为带有时间戳的文件,然后创建新的app.log。而namer函数是在生成备份文件名时调用的,因此需要确保重命名的正确性。 总结解决方法:通过自定义namer函数,将默认生成的备份文件名格式从app.log.2024-01-01改为app.2024-01-01.log。</think><< 要修改`TimedRotatingFileHandler`生成的日志文件名格式,可以通过自定义`namer`函数实现。以下是具体解决方案: ```python import logging from logging.handlers import TimedRotatingFileHandler import os def custom_namer(default_name): """将默认的app.log.2024-01-01改为app.2024-01-01.log""" # 拆分原始文件名后缀 base, ext = os.path.splitext(default_name) # 继续拆分基础文件名日期部分 parts = base.split('.') if len(parts) > 1 and '-' in parts[-1]: # 检测日期格式 # 组合新格式:主文件名 + 日期 + 原始扩展名 new_base = '.'.join(parts[:-1]) # 主文件名部分(如app) date = parts[-1] # 日期部分(如2024-01-01) return f"{new_base}.{date}{ext}" return default_name # 保留不符合条件的文件名 # 使用示例 handler = TimedRotatingFileHandler( filename='app.log', when='midnight', backupCount=7 ) handler.namer = custom_namer # 关键:注入自定义命名函数 logger = logging.getLogger(__name__) logger.addHandler(handler) ``` **实现原理解释**: 1. `TimedRotatingFileHandler`默认生成文件名格式为`原文件名.时间戳` 2. 通过`namer`属性可以覆盖默认的命名逻辑 3. 在自定义函数中: - 先将文件名拆分为基础部分扩展名(如`app.log.2024-01-01`拆分为`app.log`空字符串) - 再次拆分基础部分获取日期信息 - 重组为`主文件名.日期.扩展名`的格式 **注意事项**: - 需要确保原始文件名中没有其他包含`.`的日期格式 - 当使用其他时间间隔(如每小时)时,日期格式会变化(如`2024-01-01_12`) - 建议在文件名中保留原始扩展名以保证文件类型识别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值