這是一個用來記錄 Log的Class,只需要設定 filePath 大致上就可以運作了
public static class TraceLog
{
private static object _lockLog = new object();
private static int _numberOfLines = 0;
public static string filePath = @"C:\MyService_LOG_DIR";
public static string serviceName = "MyService"; // 服務名稱
public static int maxLines = 65536; // Log 行數限制
public static int traceLevel = 3; // value is 1~9
public static void Write(int pTraceLevel, string pSource, string message)
{
if (pTraceLevel <= traceLevel)
Write(pSource + ":" + message);
}
public static void Write(string format, params object[] message)
{
Write(string.Format(format, message));
}
public static void Write(string message)
{
if (string.IsNullOrEmpty(filePath))
{
filePath = Directory.GetCurrentDirectory();
}
// 選擇檔案名稱
string filename = filePath + string.Format("\\{0:yyyy}\\{0:MM}\\{1}.{0:yyyy-MM-dd}.txt",
DateTime.Now,
serviceName);
FileInfo finfo = new FileInfo(filename);
if (finfo.Directory.Exists == false)
{
finfo.Directory.Create();
}
if (_numberOfLines == 0)
if (File.Exists(filename))
_numberOfLines = File.ReadAllLines(filename).Length;
else
_numberOfLines = 0;
if (_numberOfLines >= maxLines)
{
// 檔案夾搬移
for (int i = 10; i > 0; i--)
{
string currFile = filename.Substring(0, filename.Length - 4) + "." + i.ToString() + ".txt";
if (File.Exists(currFile))
{
if (i == 10)
{
File.Delete(currFile);
continue;
}
FileInfo f = new FileInfo(currFile);
f.MoveTo(currFile.Substring(0, filename.Length - 4) + "." + (i + 1).ToString() + ".txt");
}
}
// 重新計算行數
finfo.MoveTo(filename.Substring(0, filename.Length - 4) + ".1.txt");
_numberOfLines = 0;
}
// 訊息格式化
string writeString = string.Format("{0:yyyy/MM/dd HH:mm:ss.ff} {1} {2}",
DateTime.Now,
serviceName + "." + System.Threading.Thread.CurrentThread.ManagedThreadId,
message) + Environment.NewLine;
// 寫Log前,先Lock
lock (_lockLog)
{
File.AppendAllText(filename, writeString, Encoding.Unicode);
}
_numberOfLines++;
}
}
2017年8月23日 星期三
Windows 服務
適用於 vs2012
Step 1. 檔案>>新增>>專案,選擇 [Windows服務]
Step 2. 點選 Service1.cs的 Design模式,按右鍵 -> Add Installer (加入安裝程式)
Step 3. 點選 serviceInstaller1,這裡需要做一些設定
1) DisplayName 就是服務要顯示的名稱
2) Description 服務描述
3) ServiceName 服務的唯一名稱
4) StartType 啓動方式,初始值爲Manual (手動),當然要設定Automatic (自動) 呀
5) DelayedAutoStart 爲開機之後是否延遲啓動,設定為False
Step 4. 點選 serviceProcessInstaller1
設定只要改一個,Account 這裡決定服務的帳號與權限,我們可以設定爲LocalSystem (就是最大權限)
Step 5. 點選 Service1.cs 相關初始程式碼
裏頭主要包含了服務 OnStart,以及 OnStop,也就是服務開啟與結束所執行的動作
以下範例中的 TraceLog 是小太陽自行撰寫的紀錄Log Class,這個Class在這裡
public Service1()
{
InitializeComponent();
this.AutoLog = false; // 因為沒有使用,所以關閉
}
protected override void OnStart(string[] args)
{
TraceLog.Write("Service OnStart");
}
protected override void OnStop()
{
TraceLog.Write("Service OnStop");
}
Step 6. 接下來就是對程式進行編譯 [F6]
Step 7. 開啟 cmd視窗,必須要是[適用於 VS2012 的開發人員命令提示字元]
安裝服務
C:\MyService\bin\Debug>InstallUtil MyService.exe
解安裝服務
C:\MyService\bin\Debug>InstallUtil /u MyService.exe
開啟服務,這邊輸入的是 Step3 所設定的ServiceName
C:\MyService\bin\Debug>net start MyService
停止服務
C:\MyService\bin\Debug>net stop MyService
例外狀況:
Issue 1. 如果 InstallUtil 出現 「不是有效的 Win32 應用程式」,那是因為安裝的環境的問題
1) 請確認編譯時,專案屬性中的 平台目標設為 x86(或Any CPU);目標 Framework 設為 .Net Framework4 以下
2) 確認機器有安裝所需的.Net Framework 版本
Issue 2. 如果沒有 Visual Studio 命令提示字元,必須使用cmd 到指定目錄下執行
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319>InstallUtil.exe "C:\MyService\bin\Debug\MyService.exe"
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319>net start MyService
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319>net stop MyService
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319>InstallUtil.exe /u "C:\MyService\bin\Debug\MyService.exe"
Step 1. 檔案>>新增>>專案,選擇 [Windows服務]
Step 2. 點選 Service1.cs的 Design模式,按右鍵 -> Add Installer (加入安裝程式)
Step 3. 點選 serviceInstaller1,這裡需要做一些設定
1) DisplayName 就是服務要顯示的名稱
2) Description 服務描述
3) ServiceName 服務的唯一名稱
4) StartType 啓動方式,初始值爲Manual (手動),當然要設定Automatic (自動) 呀
5) DelayedAutoStart 爲開機之後是否延遲啓動,設定為False
Step 4. 點選 serviceProcessInstaller1
設定只要改一個,Account 這裡決定服務的帳號與權限,我們可以設定爲LocalSystem (就是最大權限)
Step 5. 點選 Service1.cs 相關初始程式碼
裏頭主要包含了服務 OnStart,以及 OnStop,也就是服務開啟與結束所執行的動作
以下範例中的 TraceLog 是小太陽自行撰寫的紀錄Log Class,這個Class在這裡
public Service1()
{
InitializeComponent();
this.AutoLog = false; // 因為沒有使用,所以關閉
}
protected override void OnStart(string[] args)
{
TraceLog.Write("Service OnStart");
}
protected override void OnStop()
{
TraceLog.Write("Service OnStop");
}
Step 6. 接下來就是對程式進行編譯 [F6]
Step 7. 開啟 cmd視窗,必須要是[適用於 VS2012 的開發人員命令提示字元]
安裝服務
C:\MyService\bin\Debug>InstallUtil MyService.exe
解安裝服務
C:\MyService\bin\Debug>InstallUtil /u MyService.exe
開啟服務,這邊輸入的是 Step3 所設定的ServiceName
C:\MyService\bin\Debug>net start MyService
停止服務
C:\MyService\bin\Debug>net stop MyService
例外狀況:
Issue 1. 如果 InstallUtil 出現 「不是有效的 Win32 應用程式」,那是因為安裝的環境的問題
1) 請確認編譯時,專案屬性中的 平台目標設為 x86(或Any CPU);目標 Framework 設為 .Net Framework4 以下
2) 確認機器有安裝所需的.Net Framework 版本
Issue 2. 如果沒有 Visual Studio 命令提示字元,必須使用cmd 到指定目錄下執行
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319>InstallUtil.exe "C:\MyService\bin\Debug\MyService.exe"
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319>net start MyService
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319>net stop MyService
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319>InstallUtil.exe /u "C:\MyService\bin\Debug\MyService.exe"
訂閱:
文章 (Atom)