zoukankan      html  css  js  c++  java
  • Saltstack运行cmd.run重新启动tomcat后出现日志乱码(15)

    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“

  • 相关阅读:
    Hera 是一个用小程序方式来写跨平台应用的开发框架
    小程序架构设计(一)
    监控里面可观测性的黄金三角
    认清现实,放弃幻想
    系统监控的四个黄金指标
    Python爬虫爬取动态页面思路+实例(一)
    让人又爱又恨的HtmlUnit,你一定要了解一下
    JAVA实现网页抓取(htmlunit)
    使用HtmlUnit获取html页面
    c# 抓取 js动态生成的HTML的工具:NHtmlUnit‎
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7168800.html
Copyright © 2011-2022 走看看