LMES 流程日志规范
概述
本规范文档旨在为LMES系统的流程日志提供标准化的记录、存储和管理方案。通过规范化的日志体系,实现流程追溯、问题诊断、性能监控等核心功能。该规范涵盖了日志架构设计、分类体系、存储策略、格式定义、接口使用以及最佳实践等方面。
一、日志架构设计
1.1 整体架构
LMES流程日志系统采用清晰的分层架构设计,通过NLog框架实现高度灵活的日志路由和存储机制。该架构从业务发起层到最终存储层形成完整的日志处理链路,各层之间职责明确,耦合度低,便于扩展和维护。
1.1.1 分层架构说明
LMES流程日志系统的架构共分为五个核心层次,从业务操作到最终日志存储形成完整闭环:
| 架构层次 | 核心组件 | 主要职责 | 实现方式 |
|---|---|---|---|
| 业务层 | BusinessActivity等业务组件 | 触发日志记录需求,提供业务上下文信息 | 业务代码中通过Flow.Logger接口调用 |
| 日志服务层 | Flow.Logger接口 | 封装日志记录逻辑,统一日志格式 | 提供标准化的日志记录方法(Info/Warn/Error等) |
| 日志框架层 | NLog记录器 | 实现日志的路由、过滤和格式化 | 根据配置将日志分发到不同目标 |
| 配置层 | NLog-Flow.config配置文件 | 定义日志的输出规则、路径和格式 | XML格式的配置文件,支持动态调整 |
| 存储层 | 文件系统 | 按工序和工位组织存储日志文件 | 分层目录结构,支持日志文件轮转 |
1.1.2 日志流转过程
日志从产生到存储的完整流转过程如下:
- 业务层的Activity组件在执行过程中,通过
Flow.Logger接口记录各类业务事件和状态信息 - 日志服务层接收这些日志请求,按照预定义的格式进行标准化处理
- 处理后的日志被传递给NLog框架层,根据配置的规则进行过滤和路由
- NLog框架根据NLog-Flow.config中的配置,将日志分发到相应的存储目标
- 最终,日志以文件形式存储在文件系统中,按工序和工位进行分类管理
这种分层设计使得LMES流程日志系统既能够满足业务需求的灵活性,又能保证日志管理的规范性和可追溯性。
1.2 日志分类体系
1.2.1 类别命名规范
CategoryName:记录器生成的消息的类别名称
| 日志类别 | CategoryName模式 | 说明 | 示例 |
|---|---|---|---|
| 流程日志 | CMS.Plugin.Processflow.工序名称_工位名称 | 工序流程执行日志 | CMS.Plugin.Processflow.PLA_工序1_工位1 |
| 跟踪日志 | CMS.Plugin.TraceLogger.工序名称_工位名称 | 变量跟踪相关日志 | CMS.Plugin.TraceLogger.PLA_工序1_工位1 |
默认工序流程日志消息类别格式:CMS.Plugin.Processflow.工序名称_工位名称,默认 LMES基座 ProductionProcessProvider 已经按约定初始化。如果想要自定义,可按下图自定义修改。

1.2.2 日志级别定义
| 级别 | 用途 | 使用场景 |
|---|---|---|
| Trace | 详细调试信息 | 开发阶段变量跟踪 |
| Debug | 调试信息 | 开发阶段流程分析 |
| Info | 一般信息 | 正常流程执行记录 |
| Warn | 警告信息 | 异常情况但不影响流程 |
| Error | 错误信息 | 流程执行失败 |
| Fatal | 严重错误 | 系统级故障 |
二、日志存储策略
2.1 存储路径设计
LMES插件会默认提供NLog-Flow.config文件,用于将工序的流程日志按 {工序名称}_{工位名称} 分文件夹存储。
logs根目录/
├── flow_logs/
├── 工序1_工位1/
│ ├── flowlog_2024-01-01.log
│ ├── tracelog_2024-01-01.log
│ └── warnlog_2024-01-01.log
├── 工序1_工位2/
│ ├── flowlog_2024-01-01.log
│ ├── tracelog_2024-01-01.log
│ └── warnlog_2024-01-01.log
├── 工序2_工位1/
│ ├── flowlog_2024-01-01.log
│ ├── tracelog_2024-01-01.log
│ └── warnlog_2024-01-01.log
└── ...
启用上述配置后,流程日志存储路径如下图。注意:其他业务日志不会按 {工序}_{工位} 分文件夹存储,如果想要按此路径存储,可参照第一部分,配置日志记录器。

2.2 文件转转规则
| 文件类型 | 最大文件大小 | 最大存档数量 | 文件命名模式 |
|---|---|---|---|
| 流程日志 | 20MB | 100个 | flowlog_shortdate.log |
| 警告日志 | 20MB | 10个 | warnlog_date:yyyy-MM-dd.log |
| 跟踪日志 | 20MB | 50个 | tracelog_shortdate.log |
2.3 NLog配置集成
后续基座的版本会默认将该配置文件作为NLog的扩展配置文件,加载到基座中。如果当前使用的基座还没有这个配置,可手动修改 $(CMSRootPath)/host/NLog.config 文件,添加如下代码:
<include file="NLog-Extend.config" ignoreErrors="true" />

2.4 NLog配置文件详解
2.4.1 核心配置要素
NLog-Flow.config ($(CMSRootPath)/plugins/cms.plugin.messuite/Configs/NLog-Flow.config 文件)文件包含以下关键配置:

变量定义:
basedir: 日志根目录,默认为../logslogDirectory: 流程日志目录,值为flow_logsflowLogDirectory: 动态工序工位路径,通过替换logger名称生成{工序}_{工位}traceLogDirectory: 跟踪日志动态路径{工序}_{工位}
目标配置:
flowLogfile: 流程日志文件目标 (Info级别)warnLogfile: 警告日志文件目标 (Warn级别)traceLogfile: 跟踪日志文件目标consoleLog: 控制台输出目标 (开发阶段使用)
规则配置:
- 跟踪日志:
CMS.Plugin.TraceLogger.*→traceLogfile - 流程警告:
CMS.Plugin.Processflow.*(Warn级别) →warnLogfile - 流程日志:
CMS.Plugin.Processflow.*(Info级别) →flowLogfile - 控制台输出:
CMS.Plugin.Processflow.*(Trace/Debug级别) →consoleLog
2.4.2 配置文件包含关系
| 环境 | 配置文件位置 | 包含关系 |
|---|---|---|
| 基座 | $(CMSRootPath)/host/NLog.config | 包含NLog-Extend.config |
| 扩展 | NLog-Extend.config | 包含各插件流程配置 |
| LMES插件 | plugins/cms.plugin.messuite/Configs/NLog-Flow.config | 独立配置 |
| WCS插件 | plugins/cms.plugin.wcs/Configs/NLog-Flow.config | 独立配置 |
三、日志格式规范
3.1 标准格式定义
3.1.1 NLog日志格式
[${longdate}] [${level}] [${threadid}] [${logger}] ${message} ${exception}
字段说明:
${longdate}: 时间戳 (格式: yyyy-MM-dd HH:mm:ss.ffff)${level}: 日志级别 (Trace/Debug/Info/Warn/Error/Fatal)${threadid}: 线程ID${logger}: 日志记录器名称 (CategoryName)${message}: 日志消息内容${exception}: 异常信息(如有)
3.1.2 消息内容格式
${流程编号},${工位名称}_${流程名称},【实例=${流程实例Id}】->【${执行步骤名}】-> ${流程业务消息}
字段说明:
流程编号: 流程定义的编号工位名称: 当前工位名称流程名称: 流程实例名称流程实例Id: 流程实例的唯一标识执行步骤名: 当前执行的Activity名称流程业务消息: 业务相关的详细信息
3.2 格式示例对照表
进站流程日志示例
[2024-06-05 14:24:34.7023] [Info] [49] [CMS.Plugin.Processflow.PLA_工序1] 10001,PLA_GX1_工位1_普通工序流程,【实例=717568446925】->【进站信号监听】->Enter
效果如下图:(普通工序进站流程日志)

四、日志接口使用
4.1 IFlowLogger接口规范
对于流程日志的输出,LMES已经封装好了对应的日志接口,开发人员只需在对应业务代码中获取该接口,输出业务日志即可,无需再拼接流程对应的字段。
4.1.1 核心方法定义
| 方法 | 用途 | 参数说明 |
|---|---|---|
LogMessage(string message, string stepName) | 记录一般信息 | message: 业务消息,stepName: 执行步骤名 |
LogWarningMessage(string message, string stepName) | 记录警告信息 | 同上 |
LogErrorMessage(string message, string stepName) | 记录错误信息 | 同上 |
LogExceptionMessage(Exception ex, string stepName) | 记录异常信息 | ex: 异常对象,stepName: 执行步骤名 |
4.1.2 使用方式
在继承自 ProcessBusinessActivity 的Activity中,可直接使用 Flow.Logger 进行日志记录:
// 示例 1: 记录一般信息
Flow.Logger.LogMessage($"配方加工判断,工单号={currentOrder?.Code},产品型号={currentProduct?.Model}", Name);
// 示例 2: 记录警告信息
Flow.Logger.LogWarningMessage($"物料条码:{materialCode} 为空", Name);
// 示例 3: 记录错误信息
Flow.Logger.LogErrorMessage($"配方加工判断异常:{e.Message}", Name);
// 示例 4: 记录异常
Flow.Logger.LogExceptionMessage(ex, Name);

4.2 Activity集成
4.2.1 典型使用场景
1. 流程信息记录
Flow.Logger.LogMessage($"配方应用信息:产品型号={formulaApplyModel.ProductModel},配方编号={formulaApplyModel.FormulaCode},配方版本={formulaApplyModel.FormulaVersionName}", Name);
2. 异常情况处理
try
{
// 业务逻辑
}
catch (Exception e)
{
canEnterStation = false;
errorMsg = $"操作异常:{e.Message}";
Flow.Logger.LogErrorMessage(errorMsg, Name);
}
3. 调试信息输出
Flow.Logger.LogMessage($"采集参数:{string.Join(",", parameterCollectVarNames)},【TraceId={traceId}】", Name);
日志输出效果图如下:
