最近开发一个windows服务,需要各项操作和报错写入日志文件以备检查服务运行状态和错误,里面用到的方法其实也是个人在网上找的然后拼接在一起,其他不多说,代码如下:
1.默认日志存放在程序运行的目录,适合于windows服务和CS程序(其中DataAction为程序自定义的一个类,用的时候替换成自己实际程序里面随便一个类就行了)
1 public class MyLog 2 { 3 ///4 /// 日志方法(默认存放程序所在目录) 5 /// 6 /// 日志内容 7 public static void WriteLog(string info) 8 { 9 Assembly SampleAssembly;10 DataAction da= new DataAction();11 SampleAssembly = Assembly.GetAssembly(da.GetType());12 string logDir =Path.GetDirectoryName(SampleAssembly.Location)+"/日志文件/";13 string logFilePath = logDir + "/" + System.DateTime.Now.ToString("yyyyMMdd") + ".txt";14 15 string infoFull = "事件:" + info + " " + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n";16 byte[] text = Encoding.Default.GetBytes(infoFull);17 if (!Directory.Exists(logDir))18 {19 Directory.CreateDirectory(logDir);20 }21 if (!File.Exists(logFilePath))22 {23 using (FileStream fs = File.Create(logFilePath))24 {25 fs.Write(text, 0, text.Length);26 }27 }28 else29 {30 bool isUsed = FileIsUsed(logFilePath);31 if (!isUsed)32 {33 StreamWriter dout = new StreamWriter(logFilePath, true, Encoding.Default);34 dout.Write(infoFull);35 dout.Close();36 }37 else38 {39 Thread.Sleep(500);40 WriteLog(info);41 }42 }43 44 }45 46 ///47 /// 返回指示文件是否已被其它程序使用的布尔值48 /// 49 /// 文件的完全限定名,例如:“C:\MyFile.txt”。50 ///如果文件已被其它程序使用,则为 true;否则为 false。 51 static Boolean FileIsUsed(String fileFullName)52 {53 Boolean result = false;54 55 //判断文件是否存在,如果不存在,直接返回 false56 if (System.IO.File.Exists(fileFullName))57 {58 //如果文件存在,则继续判断文件是否已被其它程序使用59 60 //逻辑:尝试执行打开文件的操作,如果文件已经被其它程序使用,则打开失败,抛出异常,根据此类异常可以判断文件是否已被其它程序使用。61 System.IO.FileStream fileStream = null;62 try63 {64 fileStream = System.IO.File.Open(fileFullName, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, System.IO.FileShare.None);65 }66 catch (System.Exception ex)67 {68 result = true;69 }70 finally71 {72 if (fileStream != null)73 {74 fileStream.Close();75 }76 }77 }78 return result;79 }80 }
2.自定义日志存放目录,适合于BS程序
1 public class MyLog 2 { 3 ///4 /// 日志方法 5 /// 6 /// 日志内容 7 /// 日志存放目录 8 public static void WriteLog(string info, string logDir) 9 {10 string logFilePath = logDir + "/" + System.DateTime.Now.ToString("yyyyMMdd") + ".txt";11 string infoFull = "事件:" + info + " " + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\r\n";12 byte[] text = Encoding.Default.GetBytes(infoFull);13 if (!Directory.Exists(logDir))14 {15 Directory.CreateDirectory(logDir);16 }17 if (!File.Exists(logFilePath))18 {19 using (FileStream fs = File.Create(logFilePath))20 {21 fs.Write(text, 0, text.Length);22 }23 }24 else25 {26 bool isUsed = FileIsUsed(logFilePath);27 if (!isUsed)28 {29 StreamWriter dout = new StreamWriter(logFilePath, true,Encoding.Default);30 dout.Write(infoFull);31 dout.Close();32 }33 else34 {35 Thread.Sleep(500);36 WriteLog(info, logDir);37 }38 }39 }40 41 ///42 /// 返回指示文件是否已被其它程序使用的布尔值43 /// 44 /// 文件的完全限定名,例如:“C:\MyFile.txt”。45 ///如果文件已被其它程序使用,则为 true;否则为 false。 46 static Boolean FileIsUsed(String fileFullName)47 {48 Boolean result = false;49 50 //判断文件是否存在,如果不存在,直接返回 false51 if (System.IO.File.Exists(fileFullName))52 {53 //如果文件存在,则继续判断文件是否已被其它程序使用54 55 //逻辑:尝试执行打开文件的操作,如果文件已经被其它程序使用,则打开失败,抛出异常,根据此类异常可以判断文件是否已被其它程序使用。56 System.IO.FileStream fileStream = null;57 try58 {59 fileStream = System.IO.File.Open(fileFullName, System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, System.IO.FileShare.None);60 }61 catch (System.Exception ex)62 {63 result = true;64 }65 finally66 {67 if (fileStream != null)68 {69 fileStream.Close();70 }71 }72 }73 return result;74 }75 }