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“

Saltstack运行cmd.run重新启动tomcat后出现日志乱码(15)的更多相关文章

  1. 右击main 方法运行正常,启动tomcat 后,spring boot 项目 出现参数字符串是乱码的情况

    PrintWriter out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8")) ...

  2. idea中运行Tomcat后控制台出现乱码(统一设置成UTF-8)

    出现问题:运行Tomcat后控制台出现乱码,输出语句乱码(idea 2019.3版本) 解决方法: 方案1:File----->Settings..----->Editor-----> ...

  3. IDEA集成Docker插件后出现日志乱码的解决办法

    修改IDEA的vmoptions文件 找到IDEA安装目录的bin目录,在idea.exe.vmoptions和idea64.exe.vmoptions文件中追加以下内容: -Dfile.encodi ...

  4. tomcat的log日志乱码解决方案

    Intellij idea Tomcat输出log中文乱码 配置tomcat在VM options添加-Dfile.encoding=UTF8 -Dsun.jnu.encoding=UTF8 重启后控 ...

  5. idea启动tomcat后控制台日志显示中文乱码问题

     想必有些人 会遇到 控制台中文乱码: 可以通过以下方法解决该中文乱码问题: 1. 点击Help => Edit custom VM Options,在最后面添加 "-Dfile.en ...

  6. win10 idea启动Tomcat后控制台中文乱码

    idea 配置文件新增如下配置 -Dfile.encoding=UTF-8 -Dconsole.encoding=UTF-8

  7. intelij IDEA在启动tomcat时控制台日志乱码

    1.在idea安装目录的bin下修改idea.exe.vmoptions和idea64.exe.vmoptions,添加 -Dfile.encoding=UTF-8 -Dconsole.encodin ...

  8. npm run build 打包后,如何运行在本地查看效果(Nginx服务)

    这段时间,研究了一下vue 打包的很慢的问题.但是当我 npm run build 打包后,在本地查看效果的时候,活生生被我老大鄙视了,因为我打开了XAMPP.他说:你怎么不用Nginx啊?用这个一堆 ...

  9. mpvue使用vant Weapp运行npm run build命令打包后失效

    最近在使用mpvue开发微信小程序,在开发过程中使用有赞的小程序ui框架—— vant Weapp ,至于如何使用在我个人博客中有一篇关于如何使用vant Weapp ,需要的同学请点进这里自行查看. ...

随机推荐

  1. sqlserver还原3101

    1.出现错误"3101" 2.解决办法:删除数据库之后还原(有风险)或者获得数据库的独占访问权(用sql语句) 参考:https://www.2cto.com/database/2 ...

  2. git命令使用(一)

    作为程序员怎么能不了解git命令呢,但是由于本人不常用到git命令,现在的软件上也都一体化了,能够简化命令,直接运行都可以了,完全能够去实现git上的命令,导致输入git命令完全不会,git命令能够让 ...

  3. nginx代理yum

    适用场景:有多台服务器,但是只有1台服务器可以出公网,此时即可使用如下方式,进行yum代理,解决内网服务器不能yum的尴尬. 一.首先需要把/etc/yum.repos.d下的文件备份到bak,然后留 ...

  4. 如何用纯 CSS 创作炫酷的同心矩形旋转动画

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/bMvbRp 可交互视频教 ...

  5. EmpireofCode文档翻译 https://empireofcode.com/game/

    In Campaign mode, you can check your strategies on already defeated bases. You will not lose your tr ...

  6. Python数据结构--双向链表

    ''' 双向链表包含第一个和最后一个的链接元素. 每个链接都有一个数据字段和两个称为next和prev的链接字段. 每个链接都使用其下一个链接与其下一个链接链接. 每个链接都使用其上一个链接与之前的链 ...

  7. mysql 常用命令(二)

    1.创建数据库,并制定默认的字符集是utf8. CREATE DATABASE IF NOT EXISTS yourdbname DEFAULT CHARSET utf8 COLLATE utf8_g ...

  8. Backspace doesn't delete inner html tags of a contenteditable DIV in Firefox

    https://bugzilla.mozilla.org/show_bug.cgi?id=439808 backspace键 在ff下不能使用  div contenteditable=true时

  9. 什么样的经历,才能领悟成为架构师? >>>

    什么样的经历,才能领悟成为架构师? >>> 本文主要分析 SpringBoot 的启动过程. SpringBoot的版本为:2.1.0 release,最新版本. 一.时序图 还是老 ...

  10. web移动端小tip,box-flex

    1,移动端页面 最重要的标签: <meta content="width=device-width,initial-scale=1.0,minimum-scale=1,maximum- ...