坑爹!千万不要在生产环境使用控制台日志
前言
某控制臺(tái)應(yīng)用程序會(huì)隨機(jī)卡死,一直找不到原因。無意中在控制臺(tái)敲了下回車,發(fā)現(xiàn)程序居然恢復(fù)正常了。
最后在stackoverflow上找到了這個(gè)帖子:How and why does QuickEdit mode in Command Prompt freeze applications?[1]
原來是“快速編輯模式”造成的。
快速編輯模式
快速編輯模式是Windows的一項(xiàng)功能,它允許用戶在命令提示符窗口中使用鼠標(biāo)選擇文本(單擊并在所需文本上拖動(dòng)鼠標(biāo))。默認(rèn)情況下此功能是開啟的:
不知是何原因,應(yīng)用程序所在控制臺(tái)接收到了鼠標(biāo)事件,導(dǎo)致進(jìn)入快速編輯模式,等待我們確定選中文本,而這時(shí)應(yīng)用程序需要向控制臺(tái)輸出日志,結(jié)果導(dǎo)致死鎖。
所以解決方案是關(guān)閉快速編輯模式。
關(guān)閉快速編輯模式
可以在“控制臺(tái)窗口 屬性”中設(shè)置默認(rèn)值,取消“快速編輯模式”選項(xiàng)。
但是,為了避免部署時(shí)疏漏,使用代碼自動(dòng)禁用應(yīng)用程序的快速編輯:
const?uint?ENABLE_QUICK_EDIT?=?0x0040;const?int?STD_INPUT_HANDLE?=?-10;[DllImport("kernel32.dll",?SetLastError?=?true)] static?extern?IntPtr?GetStdHandle(int?nStdHandle);[DllImport("kernel32.dll")] static?extern?bool?GetConsoleMode(IntPtr?hConsoleHandle,?out?uint?lpMode);[DllImport("kernel32.dll")] static?extern?bool?SetConsoleMode(IntPtr?hConsoleHandle,?uint?dwMode);public?static?void?Main(string[]?args) {IntPtr?consoleHandle?=?GetStdHandle(STD_INPUT_HANDLE);uint?consoleMode;GetConsoleMode(consoleHandle,?out?consoleMode);consoleMode?&=?~ENABLE_QUICK_EDIT;SetConsoleMode(consoleHandle,?consoleMode);... }關(guān)閉控制臺(tái)日志
在生產(chǎn)環(huán)境,很少需要查看控制臺(tái)日志。因此,更好的方式是關(guān)閉控制臺(tái)日志,這樣對(duì)程序性能也有一定好處。
public?static?IHostBuilder?CreateHostBuilder(string[]?args)?=>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder?=>{webBuilder.ConfigureLogging(config?=>{//清空默認(rèn)配置config.ClearProviders();//使用第三方log});webBuilder.UseStartup<Startup>();});結(jié)論
本文的情況你可能永遠(yuǎn)不會(huì)碰到,但是對(duì)于這種隱患,建議你不要在生產(chǎn)環(huán)境使用控制臺(tái)日志。
如果你覺得這篇文章對(duì)你有所啟發(fā),請(qǐng)關(guān)注我的個(gè)人公眾號(hào)”My IO“,記住我!
參考資料
[1]
How and why does QuickEdit mode in Command Prompt freeze applications?: https://stackoverflow.com/questions/30418886/how-and-why-does-quickedit-mode-in-command-prompt-freeze-applications
總結(jié)
以上是生活随笔為你收集整理的坑爹!千万不要在生产环境使用控制台日志的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论发展的十大关系。总结过去,正视未来!!
- 下一篇: Kubernetes + .NET Co