Saltstack执行cmd.run重启tomcat后出现日志乱码(15)
来源:互联网 发布:挑战杯 知乎 编辑:程序博客网 时间:2024/06/05 05:12
Saltstack使用的cmd.run调用的是核心模块cmdmod.py,下面我们来看一下cmdmod.py模块的源码:
cat /usr/lib/python2.6/site-packages/salt/modules/cmdmod.py...... if reset_system_locale is True: if not salt.utils.is_windows(): # Default to C! # Salt only knows how to parse English words # Don't override if the user has passed LC_ALL env.setdefault('LC_ALL', 'C') #默认设置为“C” else: # On Windows set the codepage to US English. if python_shell: cmd = 'chcp 437 > nul & ' + cmd.....#run函数def run(cmd, cwd=None, stdin=None, runas=None, shell=DEFAULT_SHELL, python_shell=None, env=None, clean_env=False, template=None, rstrip=True, umask=None, output_loglevel='debug', timeout=None, reset_system_locale=True, ignore_retcode=False, saltenv='base', use_vt=False, **kwargs):......从上可知,Salt在执行cmd.run前会将minion端的字符集默认设置为“C”,而目前大部分tomcat应用使用的是UTF-8字符集,所以Salt执行cmd.run重启tomcat后会出现日志乱码。
事实上,从早期的Salt版本,以及截至到目前最新的Salt的RPM版本2015.5.5,在执行cmd.run前都会将minion端的字符集默认设置为“C”,按照我们的思想,这是一个BUG。
解决办法:
1.修改源码
cat /usr/lib/python2.6/site-packages/salt/modules/cmdmod.py...... if reset_system_locale is True: if not salt.utils.is_windows(): # Default to C! # Salt only knows how to parse English words # Don't override if the user has passed LC_ALL pass else: # On Windows set the codepage to US English. if python_shell: cmd = 'chcp 437 > nul & ' + cmd......或
cat /usr/lib/python2.6/site-packages/salt/modules/cmdmod.py......#run函数def run(cmd, cwd=None, stdin=None, runas=None, shell=DEFAULT_SHELL, python_shell=None, env=None, clean_env=False, template=None, rstrip=True, umask=None, output_loglevel='debug', timeout=None, reset_system_locale=False, ignore_retcode=False, saltenv='base', use_vt=False, **kwargs):......修改源码必须保证master端和minion端都被修改,后期新增minion端还要修改,十分麻烦。
如此可以考虑下面这种方法:
2.执行cmd.run前设定LC_ALL为空
命令行执行:
如:
salt '10.0.10.100' cmd.run 'locale' env='{"LC_ALL": ""}' #增加参数env='{"LC_ALL": ""}'编写state.sls:
locale: cmd.run: - name: locale - env: - LC_ALL: ""
以上即可解决执行cmdmod.py修改字符集的问题。
值得庆幸的是,https://github.com/saltstack/salt上目前最新版的salt 2015.8.3已经将这个问题解决了,新的cmdmod.py源码修改如下:
...... if reset_system_locale is True: if not salt.utils.is_windows(): # Default to C! # Salt only knows how to parse English words # Don't override if the user has passed LC_ALL env.setdefault('LC_CTYPE', 'C') env.setdefault('LC_NUMERIC', 'C') env.setdefault('LC_TIME', 'C') env.setdefault('LC_COLLATE', 'C') env.setdefault('LC_MONETARY', 'C') env.setdefault('LC_MESSAGES', 'C') env.setdefault('LC_PAPER', 'C') env.setdefault('LC_NAME', 'C') env.setdefault('LC_ADDRESS', 'C') env.setdefault('LC_TELEPHONE', 'C') env.setdefault('LC_MEASUREMENT', 'C') env.setdefault('LC_IDENTIFICATION', 'C') else: # On Windows set the codepage to US English. if python_shell: cmd = 'chcp 437 > nul & ' + cmd......仍是默认设置字符集为“C”,但是不再是”LC_ALL“为”C“
0 0
- Saltstack执行cmd.run重启tomcat后出现日志乱码(15)
- SUSE Tomcat日志出现乱码
- tomcat 重启,tomcat查看日志
- Tomcat服务器记录日志(Logger)出现中文乱码问题解决
- cmd chcp命令切换字符格式 cmd重定向输出到文件出现中文乱码的处理方法
- Linux Tomcat 定时重启中文乱码
- tomcat重启、关闭、查看日志shell
- VBS读取cmd命令的输出,VBS执行程序后重定向到VBS
- tomcat执行wap后不出现解压项目文件夹
- windows下使用cmd命令远程重启tomcat服务
- Jenkins执行shell重启tomcat
- linux tomcat 日志乱码
- Tomcat 修改类后不需要重启
- 修改servlet后无需重启tomcat
- 重启Tomcat后还是登录状态
- 修改方法后Tomcat不用重启
- 重启Tomcat出现这样的错误
- 监控Tomcat日志,如果OutOfMemory,重启Tomcat
- Hadoop 初级
- 快速找出故障机器
- 默认参数 参数默认值 二三事
- Android如何定制开机Logo
- laravel系列4-- 路由
- Saltstack执行cmd.run重启tomcat后出现日志乱码(15)
- 01 在递增[下面的<上面的, 左边的<右边的]二维数组中查找给定的值
- opencv2.4.9学习:加载、修改、保存一个图片
- Android Fragment 真正的完全解析(上)
- 【面试题】:海盗分钻石问题(典型倒推)
- Java之I/O之 键盘操作 转换流 系统属性流System.getProperties()
- 回顾2015,展望2016
- 【漫谈机器学习】1.误差最小VS概率最大(1)
- deep learning on tensorflow