前言

某控制台应用程序会随机卡死,一直找不到原因。无意中在控制台敲了下回车,发现程序居然恢复正常了。

最后在stackoverflow上找到了这个帖子:How and why does QuickEdit mode in Command Prompt freeze applications?[1]

原来是“快速编辑模式”造成的。

快速编辑模式

快速编辑模式是Windows的一项功能,它允许用户在命令提示符窗口中使用鼠标选择文本(单击并在所需文本上拖动鼠标)。默认情况下此功能是开启的:

不知是何原因,应用程序所在控制台接收到了鼠标事件,导致进入快速编辑模式,等待我们确定选中文本,而这时应用程序需要向控制台输出日志,结果导致死锁。

所以解决方案是关闭快速编辑模式。

关闭快速编辑模式

可以在“控制台窗口 属性”中设置默认值,取消“快速编辑模式”选项。

但是,为了避免部署时疏漏,使用代码自动禁用应用程序的快速编辑:

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);...
}

关闭控制台日志

在生产环境,很少需要查看控制台日志。因此,更好的方式是关闭控制台日志,这样对程序性能也有一定好处。

public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureWebHostDefaults(webBuilder =>{webBuilder.ConfigureLogging(config =>{//清空默认配置config.ClearProviders();//使用第三方log});webBuilder.UseStartup<Startup>();});

结论

本文的情况你可能永远不会碰到,但是对于这种隐患,建议你不要在生产环境使用控制台日志。

如果你觉得这篇文章对你有所启发,请关注我的个人公众号”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

坑爹!千万不要在生产环境使用控制台日志相关推荐

  1. 解决生产环境上日志报事务回滚的问题

    日志报错代码 : [10-6-12 9:44:01:602 GMT+08:00] 0000004d LocalTranCoor W WLTC0033W: 清除 LocalTransactionCont ...

  2. log4j2 在开发环境(win)和测试环境(win)下均可以输出日志,但在生产环境(linux)无日志输出

    一.问题说明:在开发环境和测试环境下均可以输出日志,但在生产环境无日志输出. 二.发现问题:          1,系统不同:         开发环境和测试环境(windows)         生 ...

  3. 生产环境实施 VMware 虚拟化基础架构,千万不要犯 4 个错误

    生产环境实施 VMware 虚拟化基础架构,千万不要犯 4 个错误 https://mp.weixin.qq.com/s?__biz=MjM5NTk0MTM1Mw==&mid=26506304 ...

  4. asp.net生产环境和开发环境的错误日志包装策略

    对于错误日志的输出,我们借助web.config的两个标志位: <!--全局包装异常处理页面,只有在PageError和Application_Error做清除错误操作才可不跳转--> & ...

  5. Python开发【项目】:生产环境下实时统计网站访问日志信息

    日志实时分析系统 生产环境下有需求:要每搁五分钟统计下这段时间内的网站访问量.UV.独立IP等信息,用直观的数据表格表现出来 环境描述: 网站为Nginx服务,系统每日凌晨会对日志进行分割,拷贝到其他 ...

  6. centos 日志审计_生产环境日志审计

    日志审计,就是记录所有系统和相关用户行为的信息,并且可以自动分析,处理.在中小企业环境中,一般都是在单个服务器上记录日志,而大型企业的生产环境当中,会有专门的日志服务器乃至集群.本文通过sudo配合c ...

  7. oracle 11g删除归档日志,oracle 11g生产环境清理归档日志脚本

    最近几个客户生产环境都遇到一些故障,原因就是开归档,没有部署删除归档定时任务,以下大家可以参考,经过本人测试,在生产环境上正常运行. **roidba删除归档日志脚本** 一.基于RHEL6服务器端的 ...

  8. 15分钟从零开始搭建支持10w+用户的生产环境(三)

    上一篇文章介绍了这个架构中,选择MongoDB做为数据库的原因,及相关的安装操作. 原文地址:15分钟从零开始搭建支持10w+用户的生产环境(二)   三.WebServer 在SOA和gRPC大行其 ...

  9. Sentinel(十五)之在生产环境中使用 Sentinel

    转载自  在生产环境中使用 Sentinel 引言 Sentinel 目前已可用于生产环境,除了阿里巴巴以外,也有很多企业在生产环境中广泛使用 Sentinel. 生产环境的 Sentinel Das ...

最新文章

  1. webstorm怎么跑项目_怎么跑Mint-UI的实例,你知道吗?
  2. php asp.net des,转DES的dotNet到php实现
  3. 【测试】软件测试用例设计
  4. javascript之Bom简介
  5. Notice: Undefined offset 的解决方法
  6. 电压的单位dBuV,dBmV和dBV以及dBu和dB的转化关系
  7. 设计学习---《大象》之系统分析
  8. 数据结构(C语言)超详细视频教程
  9. 中国物联网激荡20年
  10. 对象转换成Json字符串是时中文乱码
  11. 可替代50欧姆_50欧姆阻抗四层板射频信号隔层参考做不了吗?
  12. COMSOL学习(一)
  13. 怎么更改智联上的手机号,原先的号不用了
  14. 全国计算机等级考试Java上机真题
  15. 我与我的专业计算机网络作文,我与网络的故事作文600字
  16. 代购彷徨,《电商法》指路
  17. 拼音爱好者的好消息:紫光V6发版
  18. 开发者账号APP转让流程
  19. c语言计算支点距离,长安本科毕业论文设计-—三级齿轮减速器的优化设计(附c语言优化计算程序代码).doc...
  20. JavaScript - 将 CSV 数据解析为数组

热门文章

  1. Android NDK开发Crash错误定位[转]
  2. layer和3D仿射变换
  3. 关于java连接sqlserver2000 和sqlserver2005的初识
  4. JavaScript直接导出Excel,Word
  5. 数据校验器架构模式组
  6. Centos编译安装Apache 2.4.6笔记 配置
  7. [Unity优化]批处理03:静态批处理
  8. 输出最大值MXNet实现
  9. java - 匿名类
  10. MyBatis 分页插件 PageHelper