在 MISRA C 中设置日志级别的标准方法

Posted

技术标签:

【中文标题】在 MISRA C 中设置日志级别的标准方法【英文标题】:Standard Method for setting Log Level in MISRA C 【发布时间】:2018-04-09 13:02:32 【问题描述】:

背景:在 C++ 中,为单例日志记录类设置日志级别(DEBUG、WARN、ERR 等)的标准方法是通过环境变量。这样,程序员就不必传递日志级别。此外,默认情况下,任何子进程都会继承父进程的日志级别。缺点是遍历环境表是 O(n),所以你不想每次记录消息时都检查它。相反,它在启动时被检查一次,以后不再检查。但是,这被认为是可以接受的,因为预计日志级别不会在进程的生命周期内发生变化。

问题:在符合 MISRA 的 C(或一般来说只是 C)中设置日志级别的标准方法是什么?是否有一种普遍接受的方法,还是每个人都自己决定? 明确一点:我问的是为自定义日志库而不是 syslog 实现此功能的普遍接受的方式。我不是要求特定语言的支持,只要有实现此功能的标准方法即可。

提问的原因:我是 MISRA C 的新手,并且正在使用现有的代码库,其中每个进程都将日志级别作为命令行参数并将其传递给单例记录器主要的()。我想知道这种设计是否普遍并被接受,或者只是设计者的怪癖。

【问题讨论】:

您所问的似乎是一些特定于应用程序的事实上的做事方式。 MISRA-C 并不真正关心代码的“应用层”。所以我看不出你描述的设计会如何与 MISRA-C 冲突。话虽如此,通过使用不透明类型和static 文件范围变量,完全可以在C 中创建具有继承的单例类。 MISRA-C:2012 Dir 4.8 甚至鼓励使用不透明类型。 【参考方案1】:

它看起来不像是一种语言功能,而是一种运行时环境。

如果您有任何 POSIX 兼容层,那么您将获得有关 syslog(3) 文档及其相关 <syslog.h> 的更多详细信息。 这是 POSIX,虽然,所以它是 C 而非 C++。

无论如何,在发出时通过调用syslog(int priority, const char *format, ...) 选择单个日志消息的级别,其中第一个参数是优先级,最后是消息级别。

最简单的方法是在程序启动时调用openlog(const char *ident, int option, int facility),然后在需要时调用syslog()。然后从系统日志中过滤。

作为一个选项,您可以设置一个“日志过滤器”,每次发出新日志时都要检查一个 int 值。如果该级别不符合条件,请直接拨打syslog()

【讨论】:

以上是关于在 MISRA C 中设置日志级别的标准方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Winston/Node.js 中设置日志级别

通过环境变量在 Spring Boot 中设置日志记录级别

python 如何在tensorflow中设置日志记录级别

在 python 中设置基本记录器的最简单方法是啥?

scrapy框架log日志

如何在 yocto 中设置系统日志?