C#實(shí)現(xiàn)日志記錄功能的完整方案
在winform開(kāi)發(fā)過(guò)程中,有時(shí)候會(huì)需要日志功能記錄軟件運(yùn)行情況。
本文主要介紹如何使用C#開(kāi)發(fā)日記記錄模塊。
實(shí)現(xiàn)方案
整體思路就是調(diào)用日志功能方法。關(guān)于日志功能方法設(shè)計(jì)思路:
- 確認(rèn)日志文件格式和路徑
- 判斷文件和路徑是否存在,如果不存在,則創(chuàng)建對(duì)應(yīng)的文件夾和文件
- 使用using、streamwrite,將內(nèi)容寫(xiě)入到文件中
另外在本項(xiàng)目中,通過(guò)控件的事件調(diào)用日志記錄功能
知識(shí)點(diǎn)
Path
對(duì)包含文件或目錄路徑信息的 String 實(shí)例執(zhí)行操作
- 方法
- path.Combine
將字符串合并到路徑中。
string filepath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Logs", "app_log.txt");
Directory
公開(kāi)用于通過(guò)目錄和子目錄進(jìn)行創(chuàng)建、移動(dòng)和枚舉的靜態(tài)方法。 此類(lèi)不能被繼承
方法
- Exists
public static bool Exists (string? path);
path:測(cè)試的文件路徑
返回:boolean
如果 path 指向現(xiàn)有目錄,則為 true;如果該目錄不存在或者在嘗試確定指定目錄是否存在時(shí)出錯(cuò),則為 false。
- CreateDirectory
在指定路徑中創(chuàng)建所有目錄。
public static System.IO.DirectoryInfo CreateDirectory (string path);
path:要?jiǎng)?chuàng)建的目錄
返回:DirectoryInfo
一個(gè)表示在指定路徑的目錄的對(duì)象。 無(wú)論指定路徑的目錄是否已經(jīng)存在,都將返回此對(duì)象。
Streamwriter
實(shí)現(xiàn)一個(gè) TextWriter,用于以特定編碼將字符寫(xiě)入流。
- WriteLine
WriteLine(String):將字符串寫(xiě)入流,后跟行終止符。
File
提供用于創(chuàng)建、復(fù)制、刪除、移動(dòng)和打開(kāi)單個(gè)文件的靜態(tài)方法,并有助于創(chuàng)建 FileStream 對(duì)象。
- CreateText
創(chuàng)建或打開(kāi)用于寫(xiě)入 UTF-8 編碼文本的文件。 如果文件已存在,則替換其內(nèi)容。
public static System.IO.StreamWriter CreateText (string path);
Path:要打開(kāi)以進(jìn)行寫(xiě)入的文件
返回:一個(gè)StreamWriter,使用UTF-8編碼寫(xiě)入到指定的文件
- AppendText
創(chuàng)建一個(gè) StreamWriter,它將 UTF-8 編碼文本追加到現(xiàn)有文件或新文件(如果指定文件不存在)。
public static System.IO.StreamWriter AppendText (string path);
Path:要向其中追加內(nèi)容的文件的路徑。
返回:StreamWriter,一個(gè)流寫(xiě)入器,它將 UTF-8 編碼文本追加到指定文件或新文件。
三目運(yùn)算符
condition ? expression1 : expression2;
判斷條件是否成立,如果成立則執(zhí)行表達(dá)式1,否則執(zhí)行表達(dá)式2。
在本項(xiàng)目中,判斷文件是否存在,如果不存在,則創(chuàng)建文件,如果存在,則追加內(nèi)容
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
在日志記錄中,需要獲取控件的類(lèi)型。
- 方法
GetType()
獲取控件類(lèi)型
button2.GetType().Name
返回String。
關(guān)鍵代碼
- 日志記錄功能
public class TraceLog
{
public void writelog(string s,string logtype)
{
//判斷是否文件是否存在,如果不存在,則創(chuàng)建文件
//將信息和發(fā)生時(shí)間寫(xiě)入流中
//關(guān)閉文件流對(duì)象
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自動(dòng)管理流的生命周期(退出using塊自動(dòng)釋放)
// File.AppendText:等價(jià)于 FileMode.Append + Encoding.UTF8
using (StreamWriter sw = File.Exists(filepath)
? File.AppendText(filepath)
: File.CreateText(filepath))
{
// 寫(xiě)入時(shí)間+信息
//string content = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] 操作信息:用戶執(zhí)行了XXX操作\r\n";
content = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] [{logtype}]:[{s}]\r\n";
sw.WriteLine(content);
}
}
catch
{
MessageBox.Show($"日志寫(xiě)入失敗:{content}","錯(cuò)誤",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);
}
}
到此這篇關(guān)于C#實(shí)現(xiàn)日志記錄功能的完整方案的文章就介紹到這了,更多相關(guān)C#日志記錄功能內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實(shí)現(xiàn)的簡(jiǎn)單隨機(jī)數(shù)產(chǎn)生器功能示例
這篇文章主要介紹了C#實(shí)現(xiàn)的簡(jiǎn)單隨機(jī)數(shù)產(chǎn)生器功能,涉及C#簡(jiǎn)單界面布局、事件響應(yīng)及隨機(jī)數(shù)生成相關(guān)操作技巧,需要的朋友可以參考下2017-09-09
一文帶你吃透C#中面向?qū)ο蟮南嚓P(guān)知識(shí)
這篇文章主要為大家詳細(xì)介紹了C#中面向?qū)ο蟮南嚓P(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,需要的小伙伴可以參考一下2023-02-02
C#實(shí)現(xiàn)動(dòng)態(tài)加載dll的方法
這篇文章主要介紹了C#實(shí)現(xiàn)動(dòng)態(tài)加載dll的方法,涉及針對(duì)動(dòng)態(tài)鏈接庫(kù)的靈活操作技巧,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12
C#?將數(shù)據(jù)庫(kù)SqlServer數(shù)據(jù)綁定到類(lèi)中的過(guò)程詳解
本文講述的是讀取數(shù)據(jù)庫(kù)中數(shù)據(jù)的常用做法,即將數(shù)據(jù)庫(kù)中的數(shù)據(jù)綁定到創(chuàng)建的類(lèi)中,再將類(lèi)綁定到DataGridView的數(shù)據(jù)源中的做法,對(duì)C#將SqlServer數(shù)據(jù)綁定到類(lèi)中感興趣的朋友一起看看吧2022-06-06

