文件日志插件(File Logger)

CSM File Logger Addon是CSM的内置插件,基于全局日志系统,将应用的全部运行记录自动保存到文本文件中,方便事后分析和问题定位。

功能概述

File Logger通过订阅CSM全局日志队列,把应用运行过程中产生的所有日志写入.csmlog文件。这些文件是普通文本格式,可以用记事本等工具直接打开查看。

可以记录的信息

  • 模块状态变化和参数
  • 模块间消息通讯(同步/异步)及返回数据
  • 广播事件
  • 模块创建和销毁
  • 模块状态订阅关系
  • 错误信息
  • 用户自定义日志

文件管理机制

File Logger内置了滚动文件管理,防止长期运行的应用产生过大的日志文件:

参数 默认值 说明
File Size 10 MB 单个日志文件的最大大小
File Num 2 最多保留的日志文件数量

当当前日志文件超过File Size时,会创建新文件;当文件数超过File Num时,会删除最旧的文件。

工作原理

graph TD
    A[主程序启动] --> B["调用 CSM - Start File Logger.vi"]
    B --> C{Enable?}
    C -- FALSE --> D[不启动记录]
    C -- TRUE --> E[启动后台记录线程]
    E --> F[后台线程: CSM-Logger-Thread.vi]
    F --> G[订阅 Global Log Queue]
    G --> H{收到日志?}
    H -- 是 --> I[写入 .csmlog 文件]
    I --> J{文件超过 File Size?}
    J -- 是 --> K[创建新文件 / 删除最旧文件]
    K --> H
    J -- 否 --> H
    H -- 退出信号 --> L{队列为空?}
    L -- 否 --> M[等待处理完剩余日志]
    M --> L
    L -- 是或超时 --> N[线程退出]

退出机制:File Logger支持三种退出方式:

  1. WatchDog方式(默认启用):调用者VI退出时,其持有的Watchdog Queue资源自动释放,触发后台线程退出。也可以手动释放Watchdog Queue来主动停止记录。
  2. 全部模块退出(可选):启用Exit When All Module Exist?后,所有CSM模块退出时,记录线程也自动退出(适合主程序本身不是CSM模块的场景)。

队列清空保证:退出时后台线程会等待队列中剩余日志处理完毕(最多5秒超时),确保不丢失日志。

函数说明

函数速览

函数 说明
CSM - Start File Logger.vi 启动文件记录后台线程,是唯一需要主动调用的API
CSM - Convert Filter Rules.vi 将过滤规则簇转换为类实例,用于配置Filter Rules参数
CSM - Set Log Filter Rules.vi 设置全局源端过滤,减少无需记录的日志产生

CSM - Start File Logger.vi 参数详解

这是唯一需要在程序中调用的API,通常在主程序初始化阶段调用一次:

输入参数

参数 默认值 说明
Log File Path 日志文件路径,建议使用绝对路径
Timestamp format %<%Y/%m/%d %H:%M:%S%3u>T 时间戳格式
Log Limit File Size: 10 MB, File Num: 2 文件大小和数量限制
Filter Rules 过滤规则(用CSM - Convert Filter Rules.vi配置)
Enable? TRUE 设为FALSE时不启动记录,可用于生产/调试环境切换
WatchDog? TRUE 启用WatchDog机制,调用VI退出时自动停止记录
Exit When All Module Exist? FALSE 所有CSM模块退出时自动停止记录

输出参数

参数 说明
Log File 实际使用的日志文件路径
Watchdog Queue WatchDog资源句柄,保持引用直到程序结束

调用逻辑

sequenceDiagram
    participant Main as 主程序
    participant Logger as File Logger Addon
    participant Filter as 过滤规则配置
    participant Thread as 后台记录线程

    Main->>Filter: CSM - Convert Filter Rules.vi<br/>(配置需要过滤的模块/状态)
    Main->>Logger: CSM - Start File Logger.vi<br/>(Log File Path, Log Limit, Filter Rules...)
    Logger-->>Thread: 异步启动后台线程
    Logger-->>Main: Log File, Watchdog Queue

    Note over Main,Thread: 应用运行中...

    Thread->>Thread: 订阅 Global Log Queue
    loop 持续记录
        Thread->>Thread: 从队列获取日志
        Thread->>Thread: 写入 .csmlog 文件
        Thread->>Thread: 检查文件大小/数量限制
    end

    Note over Main: 主程序退出,Watchdog Queue 被释放
    Main-->>Thread: WatchDog触发退出信号
    Thread->>Thread: 处理完剩余日志后退出

典型应用场景

以下展示 File Logger 在实际项目中的典型用法,将日志文件路径、记录限制、过滤规则等配置集中在初始化阶段,配置好后后台自动运行,无需再关注。

// 主程序初始化阶段

// 可选:过滤掉高频轮询等不关心的状态,减少磁盘写入
CSM - Convert Filter Rules.vi
  (过滤 "Idle" 状态、高频采集状态等)
→ Filter Rules

CSM - Start File Logger.vi
  Log File Path: "C:\Logs\app.csmlog"
  Log Limit: {File Size: 20MB, File Num: 5}
  Filter Rules: Filter Rules
  Enable?: TRUE          // 可通过配置文件或条件控制,FALSE 时不启动记录
  WatchDog?: TRUE        // 主程序退出时自动停止记录
→ Watchdog Queue(保持引用直到程序结束,不要手动释放)

常见配置变体

  • 生产/调试切换:将 Enable? 绑定到配置项,发布时设为 FALSE 即可完全禁用,无需修改代码结构
  • 源端过滤:在调用 File Logger 前用 CSM - Set Log Filter Rules.vi 设置全局过滤,日志在源头就不产生,对所有工具生效
  • 非CSM主程序:主程序本身不是CSM模块时,可设 Exit When All Module Exist? = TRUE,所有CSM模块退出后记录自动停止

参考范例Addons - Logger\CSM Application Running Log Example.vi

日志文件说明

  • 文件格式:纯文本,后缀.csmlog,可用记事本、VS Code等工具打开
  • 时间戳:每条记录包含时间戳,格式由Timestamp format参数控制
  • 文件命名:多个滚动文件会自动添加序号后缀
  • 内容示例
2024/03/01 10:25:30.123 [STATE] Module1 >> Initialize
2024/03/01 10:25:30.156 [MSG] Module2 ->> API: Start >> Arguments -> Module1
2024/03/01 10:25:30.158 [STATE] Module1 >> API: Start
2024/03/01 10:25:30.210 [BROADCAST] Module1 >> Status: Ready >>

注意事项

Watchdog Queue不要手动释放(除非主动停止记录):CSM - Start File Logger.vi输出的Watchdog Queue句柄必须保持有效,直到程序结束。一旦释放,后台记录线程会立即触发退出流程。

  • 尽早调用:在主程序初始化阶段调用,确保从程序启动就开始记录
  • 路径选择:建议使用绝对路径,并确保路径所在磁盘有足够空间
  • 生产环境:可以通过Enable? = FALSE完全禁用记录,也可以通过过滤规则减少无关日志
  • 性能影响:File Logger在独立的后台线程运行,对主程序性能影响很小;大量日志时可通过过滤规则降低写入频率

相关文档