Logging

      Logging是定位错误的最重要的部分,但是它很难获得,特别是在手机平台,在应用开发和执行发生在不同的机器上。Android有很好的日志框架来推出Android系统本身和引用程序的日志信息。一套用户水平的应用程序也被提供来浏览和过滤这些日志,例如logcat和Dalvik Debug Monitor Server工具等。

   框架:

   这个Android日志框架是由命名为logger的内核模块来实现的 。这大量的平台的日志信息在给定的时间使浏览和分析这些日志信息非常困难。为了简化这个过程,这个Android日志框架给日志信息分成了4个独立的日志缓存:

       Main:主要应用程序日志信息。

       Events:系统事件。

       Radio:与基带相关的日志信息。

       System:低水平的系统调试信息。

提供了一套API的调用运行Java和native代码来容易的发送日志信息到logger内核模块。这对于本地代码的Logging API获得通过android/log.h头文件。为了使用这个logging函数,本地代码应该首先包含这个头文件。

    #include<android/log.h>

除了包含恰当的头文件,这Android.mk文件需要动态的被修改来连接本地模使用log库。这被获得使用LOcal_LDIBS建立系统变量,如下。这个建立系统变量必须被放置在共享库建立片元的前面;否则没有效果的。

LOCAL_MODULE:=hello-jni

....

LOCAL_LDLIBS+=-llog

....

include $(BUILD_SHARED_LIBRARY)

日志信息:

   每个通过logging APIs分配给logger模块的日志条目,都有下面的属性:

   Priority:可能是vrbose,debug,info,warning,error,fatal。被支持的日志优先水平被定义在android/log.h头文件下,如下:

   typedef enum android_LogPriority {
...
ANDROID_LOG_VERBOSE,
ANDROID_LOG_DEBUG,
ANDROID_LOG_INFO,
ANDROID_LOG_WARN,
ANDROID_LOG_ERROR,
ANDROID_LOG_FATAL,
...
} android_LogPriority;

Tag:定义了发出消息的组件。这个logcat和DDMS工具也能够过滤基于这个标签值得日志信息。这个标签被期望是合理的端。

Meessage:Text文本展示真正的日志信息。这换行符自动的添加到每个日志信息。因为环形日志缓存是相当小的,它强烈的推荐应用程序应该保持日志消息在一个合理的水平。

日志函数: 

   这个android/log.h头文件定义了一套本地的代码来发出日志消息。

   _android_log_write:能够被用来发出一个简单的字符串作为一个日志信息。它取日志优先级,日志标签,和一个日志消息,如下:

  __android_log_write(ANDROID_LOG_WARN, "hello-jni", "Warning log.");

_android_log_print:能够被用来发出一个有格式的字符串作为一个日志消息。它取日志优先,log标签和字符串格式,和其他参数的变量数量被指导以这个格式,如下:

__android_log_print(ANDROID_LOG_ERROR, "hello-jni",
"Failed with errno %d", errno);

_android_log_vprint:它和这个_android_log_print函数功能相同,除了额外的参数被传递为一个va_list代替一系列的参数。这个事非常有用的,如果你计划调用logging函数被传递给目前函数的参数的变量数量,如下:

void log_verbose(const char* format, ...)
{
va_list args;
va_start(args, format);
__android_log_vprint(ANDROID_LOG_VERBOSE, "hello-jni", format, args);
va_end(args);
}
...
void example()
{
log_verbose("Errno is now %d", errno);
}

_android_log_assert:能够被用来日志断言错误。与其他的日志函数相比,它并没有一个日志优先和总是发出作为fatal的。如果一个debugger被附加,它也SIGTRAP的目前进程能够近一步检测通过debugger:

if (0 != errno)
{
__android_log_assert("0 != errno", "hello-jni",
"There is an error.");
}

资源下载链接为: https://pan.quark.cn/s/140386800631 通用大模型文本分类实践的基本原理是,借助大模型自身较强的理解和推理能力,在使用时需在prompt中明确分类任务目标,并详细解释每个类目概念,尤其要突出类目间的差别。 结合in-context learning思想,有效的prompt应包含分类任务介绍及细节、类目概念解释、每个类目对应的例子和待分类文本。但实际应用中,类目和样本较多易导致prompt过长,影响大模型推理效果,因此可先通过向量检索缩小范围,再由大模型做最终决策。 具体方案为:离线时提前配置好每个类目的概念及对应样本;在线时先对给定query进行向量召回,再将召回结果交给大模型决策。 该方法不更新任何模型参数,直接使用开源模型参数。其架构参考GPT-RE并结合相关实践改写,加入上下文学习以提高准确度,还使用BGE作为向量模型,K-BERT提取文本关键词,拼接召回的相似例子作为上下文输入大模型。 代码实现上,大模型用Qwen2-7B-Instruct,Embedding采用bge-base-zh-v1.5,向量库选择milvus。分类主函数的作用是在向量库中召回相似案例,拼接prompt后输入大模型。 结果方面,使用ICL时accuracy达0.94,比bert文本分类的0.98低0.04,错误类别6个,处理时添加“家居”类别,影响不大;不使用ICL时accuracy为0.88,错误58项,可能与未修改prompt有关。 优点是无需训练即可有较好结果,例子优质、类目界限清晰时效果更佳,适合围绕通用大模型api打造工具;缺点是上限不高,仅针对一个分类任务部署大模型不划算,推理速度慢,icl的token使用多,用收费api会有额外开销。 后续可优化的点是利用key-bert提取的关键词,因为核心词语有时比语意更重要。 参考资料包括
03-12
### Python 中日志记录 (logging) 使用方法 在 Python 开发过程中,`logging` 模块被广泛用于跟踪事件的发生情况以便于后续分析和调试。此模块提供了一种结构化的方式来处理不同严重程度的消息,并允许这些消息发送到多个目的地。 #### 创建并配置 Logger 实例 为了开始使用 `logging` 模块,通常会先获取一个 logger 对象: ```python import logging logger = logging.getLogger('my_logger') ``` 可以通过调用 getLogger() 函数来创建一个新的 logger 或者访问已存在的同名 logger [^4]。一旦有了 logger 对象之后,则可以根据需要对其进行进一步的个性化设置,比如设定最低的日志等级、指定输出格式等。 #### 设置日志级别与处理器 日志级别决定了哪些类型的日志会被实际写入文件或其他目标位置;常见的有 DEBUG, INFO, WARNING, ERROR 和 CRITICAL 这五个级别的日志信息。默认情况下,只有 WARN 及以上级别的日志才会显示出来。如果希望改变这一行为,可以这样做: ```python logger.setLevel(logging.DEBUG) console_handler = logging.StreamHandler() file_handler = logging.FileHandler('app.log') formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') console_handler.setFormatter(formatter) file_handler.setFormatter(formatter) logger.addHandler(console_handler) logger.addHandler(file_handler) ``` 上述代码片段展示了如何向 logger 添加控制台和文件两个不同的 handler 来分别处理不同类型或者去处的日志数据流 [^3]。 #### 记录日志条目 当一切准备就绪后就可以利用 logger 发布各种各样的日志了: ```python logger.debug("This is a debug message.") logger.info("Informational message here.") logger.warning("Warning:config file not found!") logger.error("Error occurred.") logger.critical("Critical error! System might be unstable now.") ``` 每一种 log 方法对应着特定的日志级别,在编写应用时应当依据实际情况选择合适的方式来进行日志记录 [^1]。 #### 安全性考虑 值得注意的是,在设计日志系统的过程中还需要考虑到安全性因素。例如,应避免将敏感个人信息或者其他机密资料暴露给未经授权的人士查看。因此建议采取措施保护好存储介质上的原始日志文档,并且谨慎对待任何可能泄露隐私的内容 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值