C#实现日志记录功能的完整方案

 更新时间:2025年12月09日 08:43:35   作者:yue008  
这篇文章主要介绍了如何在C# Winform项目中实现日志记录功能,包括日志文件的创建、路径判断、内容写入、以及通过控件事件调用日志记录的方法,需要的朋友可以参考下

在winform开发过程中,有时候会需要日志功能记录软件运行情况。

本文主要介绍如何使用C#开发日记记录模块。

实现方案

整体思路就是调用日志功能方法。关于日志功能方法设计思路:

  • 确认日志文件格式和路径
  • 判断文件和路径是否存在,如果不存在,则创建对应的文件夹和文件
  • 使用using、streamwrite,将内容写入到文件中
    另外在本项目中,通过控件的事件调用日志记录功能

知识点

Path

对包含文件或目录路径信息的 String 实例执行操作

  • 方法
  • path.Combine
    将字符串合并到路径中。
string filepath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Logs", "app_log.txt");

Directory

公开用于通过目录和子目录进行创建、移动和枚举的静态方法。 此类不能被继承

方法

  • Exists
public static bool Exists (string? path);

path:测试的文件路径
返回:boolean
如果 path 指向现有目录,则为 true;如果该目录不存在或者在尝试确定指定目录是否存在时出错,则为 false。

  • CreateDirectory
    在指定路径中创建所有目录。
public static System.IO.DirectoryInfo CreateDirectory (string path);

path:要创建的目录

返回:DirectoryInfo

一个表示在指定路径的目录的对象。 无论指定路径的目录是否已经存在,都将返回此对象。

Streamwriter

实现一个 TextWriter,用于以特定编码将字符写入流。

  • WriteLine
    WriteLine(String):将字符串写入流,后跟行终止符。

File

提供用于创建、复制、删除、移动和打开单个文件的静态方法,并有助于创建 FileStream 对象。

  • CreateText
    创建或打开用于写入 UTF-8 编码文本的文件。 如果文件已存在,则替换其内容。
public static System.IO.StreamWriter CreateText (string path);

Path:要打开以进行写入的文件
返回:一个StreamWriter,使用UTF-8编码写入到指定的文件

  • AppendText
    创建一个 StreamWriter,它将 UTF-8 编码文本追加到现有文件或新文件(如果指定文件不存在)。
public static System.IO.StreamWriter AppendText (string path);

Path:要向其中追加内容的文件的路径。
返回:StreamWriter,一个流写入器,它将 UTF-8 编码文本追加到指定文件或新文件。

三目运算符

condition ? expression1 : expression2;

判断条件是否成立,如果成立则执行表达式1,否则执行表达式2。

在本项目中,判断文件是否存在,如果不存在,则创建文件,如果存在,则追加内容

StreamWriter sw = File.Exists(filepath)? File.AppendText(filepath) : File.CreateText(filepath)

字符串拼接

string logtype=string.Empty;
string s=string.Empty;
string content=string.Empty;
 content = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] [{logtype}]:[{s}]\r\n";

Type

在日志记录中,需要获取控件的类型。

  • 方法
    GetType()
    获取控件类型
button2.GetType().Name

返回String。

关键代码

  • 日志记录功能
public  class TraceLog
{
    public void writelog(string s,string logtype)
    {
        //判断是否文件是否存在,如果不存在,则创建文件
        //将信息和发生时间写入流中
        //关闭文件流对象

        string filepath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Logs", "app_log.txt");
        string content=string.Empty;
        try
        {
            // 确保目录存在
            string logDir = Path.GetDirectoryName(filepath);
            if (!Directory.Exists(logDir)) Directory.CreateDirectory(logDir);

            // using自动管理流的生命周期(退出using块自动释放)
            // File.AppendText:等价于 FileMode.Append + Encoding.UTF8
            using (StreamWriter sw = File.Exists(filepath)
                ? File.AppendText(filepath)
                : File.CreateText(filepath))
            {
                // 写入时间+信息
                //string content = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] 操作信息:用户执行了XXX操作\r\n";
                 content = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] [{logtype}]:[{s}]\r\n";
                sw.WriteLine(content);
            }
        }
        catch
        {
            MessageBox.Show($"日志写入失败:{content}","错误",MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}
  • 主窗体代码
TraceLog App_log=new TraceLog();
private void button1_Click(object sender, EventArgs e)
{
    string CtrType = GetType().Name + "-" + button1.GetType().Name;
    App_log.writelog(button1.Tag.ToString(), CtrType);
}

private void button2_Click(object sender, EventArgs e)
{
    string CtrType = GetType().Name + "-" + button2.GetType().Name;
    App_log.writelog(button2.Tag.ToString(), CtrType);
}

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if(e.KeyValue==13)
    {
        string CtrType = GetType().Name +"-"+ textBox1.GetType().Name;
        App_log.writelog(textBox1.Tag.ToString(), CtrType);
    }
}

private void textBox2_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 13)
    {
        string CtrType = GetType().Name+ "-" + textBox2.GetType().Name;
        App_log.writelog(textBox2.Tag.ToString(), CtrType);
    }
}

到此这篇关于C#实现日志记录功能的完整方案的文章就介绍到这了,更多相关C#日志记录功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c# 实现的支付宝支付

    c# 实现的支付宝支付

    这篇文章主要介绍了c# 实现的支付宝支付的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2021-01-01
  • C#实现的简单随机数产生器功能示例

    C#实现的简单随机数产生器功能示例

    这篇文章主要介绍了C#实现的简单随机数产生器功能,涉及C#简单界面布局、事件响应及随机数生成相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • 一文带你吃透C#中面向对象的相关知识

    一文带你吃透C#中面向对象的相关知识

    这篇文章主要为大家详细介绍了C#中面向对象的相关知识,文中的示例代码讲解详细,对我们学习C#有一定的帮助,需要的小伙伴可以参考一下
    2023-02-02
  • C#实现动态加载dll的方法

    C#实现动态加载dll的方法

    这篇文章主要介绍了C#实现动态加载dll的方法,涉及针对动态链接库的灵活操作技巧,具有一定的参考借鉴价值,需要的朋友可以参考下
    2014-12-12
  • WPF MVVM示例讲解

    WPF MVVM示例讲解

    WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI,这篇文章通过示例让大家体验下WPF MVM,有需要的朋友可以参考下
    2015-08-08
  • C#中的枚举类型(Enum)介绍

    C#中的枚举类型(Enum)介绍

    这篇文章介绍了C#中的枚举类型(Enum),文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • C#实现给图片加水印的方法

    C#实现给图片加水印的方法

    这篇文章主要介绍了C#实现给图片加水印的方法,结合完整实例形式分析了C#常见的图片水印操作相关实现技巧,需要的朋友可以参考下
    2016-02-02
  • C#中使用angular的方法步骤

    C#中使用angular的方法步骤

    在本篇内容里我们给大家整理了关于C#中使用angular的方法以及具体步骤内容,有兴趣的朋友们学习下。
    2019-06-06
  • C# 将数据库SqlServer数据绑定到类中的过程详解

    C# 将数据库SqlServer数据绑定到类中的过程详解

    本文讲述的是读取数据库中数据的常用做法,即将数据库中的数据绑定到创建的类中,再将类绑定到DataGridView的数据源中的做法,对C#将SqlServer数据绑定到类中感兴趣的朋友一起看看吧
    2022-06-06
  • C#识别出图片里的数字和字母

    C#识别出图片里的数字和字母

    本文给大家分享的是C#识别出图片里的数字和字母的代码,主要是识别以前公司的软件注册码截图里的数字和字母,功能很简单,也存在很大的局限性,这里仅仅是分享,小伙伴们参考下。
    2015-03-03

最新评论