C#中使用跟踪侦听器TraceListener

本文介绍如何在C#中使用TextWriterTraceListener进行日志记录,并提供了一个实用的TraceHelper类,该类能够记录不同类型的日志消息。此外,还展示了如何在App.config文件中配置TraceListener,并给出了具体的日志记录实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

修改App.config文件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
	<system.diagnostics>
		<trace autoflush="true" indentsize="0">
			<listeners>
				<add name="LogListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="LogConsoleApp.log"/>
			</listeners>
		</trace>
	</system.diagnostics>
</configuration>

此时添加一个类型为System.Diagnostics.TextWriterTraceListener,它被设置为写入名为LogConsoleApp.log。还请注意,在节点,我们将设置autoflush属性为true。当设置为true此属性告诉侦听器在每次写操作后刷新缓冲区。实际应用程序,您可能希望将其设置为false限制磁盘读写操作。

记录器类

创建的记录器相当粗糙,因为我们没有记录错误的日期和时间,也没有记录源。因此,让我们通过创建一个小型记录器类来稍微扩展这个概念,如下所示

public class TraceHelper
{
    private static TraceHelper _traceHelper;

    private TraceHelper()
    {
    }

    public static TraceHelper GetInstance()
    {
        if (_traceHelper == null)
            _traceHelper = new TraceHelper();

        return _traceHelper;
    }

    public void Error(string message, string module)
    {
        Log(message, MessageType.Error, module);
    }

    public void Error(Exception ex, string module)
    {
        Log(ex.StackTrace, MessageType.Error, module);
    }

    public void Warning(string message, string module)
    {
        Log(message, MessageType.Warning, module);
    }

    public void Info(string message, string module)
    {
        Log(message, MessageType.Information, module);
    }

    private void Log(string message, MessageType type, string module)
    {
        System.Diagnostics.Trace.WriteLine(
            string.Format("{0},{1},{2},{3}",
            DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
            type.ToString(),
            module,
            message));
    }
}

public enum MessageType
{
    Information = 0,
    Warning = 1,
    Error = 2
}

实际应用代码

var totalMoney1 = qry2.Where(a => a.name != "").Sum(a => a.total);
var totalMoney2 = qry2.Where(a => a.name == "").Sum(a => a.total);
TraceHelper.GetInstance().Info($"{ name } ,已收款总合计={totalMoney1},未收款总合计={totalMoney2}", "main");

记录文件

2020-09-18 10:16:32,Information,main,未知发票管理单位 ,已收款总合计=0  ,  未收款总合计=2284771.71
2020-09-18 10:16:33,Information,main,发展公司 ,已收款总合计=822633  ,  未收款总合计=211402
2020-09-18 10:16:33,Information,main,花市 ,已收款总合计=570000  ,  未收款总合计=1543003.0
2020-09-18 10:16:34,Information,main,滘口联队 ,已收款总合计=0  ,  未收款总合计=15000
2020-09-18 10:16:34,Information,main,九社 ,已收款总合计=0  ,  未收款总合计=13500
2020-09-18 10:16:34,Information,main,三社 ,已收款总合计=0  ,  未收款总合计=1872
2020-09-18 10:16:34,Information,main,十社 ,已收款总合计=0  ,  未收款总合计=7800
2020-09-18 10:16:34,Information,main,十一社 ,已收款总合计=0  ,  未收款总合计=9000
2020-09-18 10:16:34,Information,main,四社 ,已收款总合计=0  ,  未收款总合计=1296390
2020-09-18 10:16:34,Information,main,五眼桥联社 ,已收款总合计=571916  ,  未收款总合计=715843.0
### 使用S7NetPlus进行通信跟踪 为了实现C#使用S7NetPlus与西门子PLC之间的通信跟踪,可以采用日志记录的方式捕获所有的读写操作以及连接状态的变化。这不仅有助于调试程序逻辑错误,还能帮助理解实际网络交互过程。 #### 添加日志功能到现有代码 可以在原有基础上引入`System.Diagnostics`命名空间下的`TraceListener`类来监听并记录下每一次尝试访问PLC的动作: ```csharp using S7.Net; using System; using System.Diagnostics; class Program { private static readonly TraceSource trace = new("PlcCommunication", SourceLevels.All); static void Main(string[] args) { // 设置追踪侦听器输出目标为控制台 trace.Listeners.Add(new ConsoleTraceListener()); Plc plc = new Plc(CpuType.S7300, "192.168.0.1", 0, 2); try { trace.TraceInformation($"Attempting to open connection with PLC at IP: {plc.IpAddress}"); plc.Open(); trace.TraceInformation("Reading bytes from Data Block..."); byte[] bytes = plc.ReadBytes(DataType.DataBlock, 1, 0, 200); trace.TraceData(TraceEventType.Information, 0, $"Read data block content: {BitConverter.ToString(bytes)}"); ushort result = (ushort)plc.Read("DB1.DBW0"); trace.TraceInformation($"Value read from DB1.DBW0 is: {result}"); trace.TraceInformation("Writing value '500' into DB1.DBW0..."); plc.Write("DB1.DBW0", (ushort)500); trace.Flush(); plc.Close(); trace.TraceEvent(TraceEventType.Stop, 0, "Connection closed."); } catch (Exception ex) { trace.TraceEvent(TraceEventType.Error, 0, $"An error occurred during operation: {ex.Message}"); Console.WriteLine("Error: " + ex.Message); } trace.Close(); } } ``` 上述代码片段展示了如何集成基本的日志机制以便于观察应用程序同PLC间的交流情况[^1]。 对于更详细的文档说明和支持资源,则建议查阅官方GitHub页面上的README文件和其他贡献者提交的相关资料[^3]。此外,在遇到具体技术难题时也可以参考社区论坛或加入开发者聊天群组获取即时的帮助和支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值