如何降低 Python 应用程序中 AppDynamics 代理和代理的标准输出详细程度

问题描述 投票:0回答:1

我正在将 AppDynamics Python 代理集成到 FastAPI 项目中以进行监控,并且在我的标准输出中遇到了有关日志详细程度的一些障碍。我使用以下命令启动 FastAPI 应用程序以包含 AppDynamics 代理:

pyagent run -c appdynamics.cfg uvicorn my_app:app --reload

我的目标是减少从 AppDynamics 代理和代理输出到 stdout 的日志的冗长性,旨在保持控制台输出干净并专注于更关键的问题。

我的模块版本:

$ pip freeze | grep appdy
appdynamics==23.10.0.6327
appdynamics-bindeps-linux-x64==23.10.0
appdynamics-proxysupport-linux-x64==11.64.3

这是我的

appdynamics.cfg
配置文件的内容:

[agent]
app = my-app
tier = my-tier
node = teste-local-01

[controller]
host = my-controller.saas.appdynamics.com
port = 443
ssl = true
account = my-account
accesskey = my-key

[log]
level = warning
debugging = off

我尝试通过修改代理的

log4j.xml
文件将日志记录级别设置为 WARNING 来进一步降低日志详细程度。然而,这个改变并没有达到我所希望的效果。我调整的
log4j.xml
文件位于:

/tmp/appd/lib/cp311-cp311-63ff661bc175896c1717899ca23edc8f5fa87629d9e3bcd02cf4303ea4836f9f/site-packages/appdynamics_bindeps/proxy/conf/logging/log4j.xml

以下是我对

log4j.xml
所做的调整:

    <appender class="com.singularity.util.org.apache.log4j.ConsoleAppender" name="ConsoleAppender">
        <layout class="com.singularity.util.org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} %5p [%t] %c{1} - %m%n" />
        </layout>
        <filter class="com.singularity.util.org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMax" value="FATAL" />
            <param name="LevelMin" value="WARNING" />
        </filter>

尽管做出了这些努力,我仍然看到来自代理和代理的大量日志。任何人都可以提供有关如何有效地将 AppDynamics Python 代理及其代理的日志输出降低到标准输出的指导或建议吗?任何有关确保正确应用我对

log4j.xml
的更改的提示也将不胜感激。

提前感谢您的帮助!

我想从标准输出中删除的日志消息示例:

2024-03-23 11:15:28,409 [INFO] appdynamics.proxy.watchdog <22759>: Started watchdog with pid=22759
2024-03-23 11:15:28,409 [INFO] appdynamics.proxy.watchdog <22759>: Started watchdog with pid=22759
...
[AD Thread Pool-ProxyControlReq0] Sat Mar 23 11:15:51 BRT 2024[DEBUG]: JavaAgent - Setting AgentClassLoader as Context ClassLoader
[AD Thread Pool-ProxyControlReq0] Sat Mar 23 11:15:52 BRT 2024[INFO]: JavaAgent - Low Entropy Mode: Attempting to swap to non-blocking PRNG algorithm
[AD Thread Pool-ProxyControlReq0] Sat Mar 23 11:15:52 BRT 2024[INFO]: JavaAgent - UUIDPool size is 10
Agent conf directory set to [/home/wsl/.pyenv/versions/3.11.6/lib/python3.11/site-packages/appdynamics_bindeps/proxy/conf]
...
11:15:52,167  INFO [AD Thread Pool-ProxyControlReq0] BusinessTransactions - Starting BT Logs at Sat Mar 23 11:15:52 BRT 2024
11:15:52,168  INFO [AD Thread Pool-ProxyControlReq0] BusinessTransactions - ###########################################################
11:15:52,169  INFO [AD Thread Pool-ProxyControlReq0] BusinessTransactions - Using Proxy Version [Python Agent v23.10.0.6327 (proxy v23.10.0.35234) compatible with 4.5.0.21130 Python Version 3.11.6]
11:15:52,169  INFO [AD Thread Pool-ProxyControlReq0] JavaAgent - Logging set up for log4j2
...
11:15:52,965  INFO [AD Thread Pool-ProxyControlReq0] JDBCConfiguration - Setting normalizePreparedStatements to true
11:15:52,965  INFO [AD Thread Pool-ProxyControlReq0] CallGraphConfigHandler - Call Graph Config Changed  callgraph-granularity-in-ms  Value -null
python logging proxy appdynamics
1个回答
0
投票

我在 AppDynamics 支持中找到了 Damian 分享的解决方法,它帮助我调整 AppDynamics 中代理和看门狗的日志级别。以下是步骤摘要:

  • 代理日志级别:

    log4j2.xml
    文件对此进行控制。您可以在 appdynamics_bindeps 模块中找到它。例如,在我的 WSL 设置中,它位于
    /home/wsl/.pyenv/versions/3.11.6/lib/python3.11/site-packages/appdynamics_bindeps/proxy/conf/logging/log4j2.xml
    。在 Docker 镜像 python:3.9 中,路径为
    /usr/local/lib/python3.9/site-packages/appdynamics_bindeps/proxy/conf/logging/log4j2.xml
    。将该部分中的级别修改为以下级别之一:debug、info、warn、error 或 fatal。

  • 看门狗日志级别: 这可以在 appdynamics Python 模块中的

    proxy.py
    文件中进行调整。例如,在我的 WSL 设置中,它位于
    /home/wsl/.pyenv/versions/3.11.6/lib/python3.11/site-packages/appdynamics/scripts/pyagent/commands/proxy.py
    。在 Docker 镜像 python:3.9 中,路径为
    /usr/local/lib/python3.9/site-packages/appdynamics/scripts/pyagent/commands/proxy.py
    。您需要通过更改级别变量来硬编码configure_proxy_logger和configure_watchdog_logger函数中的日志级别。

我的版本

$ pip freeze | grep appdynamics
appdynamics==24.2.0.6567
appdynamics-bindeps-linux-x64==24.2.0
appdynamics-proxysupport-linux-x64==11.68.3

原始文件

log4j2.xml

<Loggers>
    <!-- Modify each <AsyncLogger> level as needed -->
    <!-- Exemple -->
        <AsyncLogger name="com.singularity" level="info" additivity="false">
            <AppenderRef ref="Default"/>
            <AppenderRef ref="RESTAppender"/>
            <AppenderRef ref="Console"/>
        </AsyncLogger>
</Loggers>

代理.py

def configure_proxy_logger(debug):
    logger = logging.getLogger('appdynamics.proxy')
    level = logging.DEBUG if debug else logging.INFO
    pass

def configure_watchdog_logger(debug):
    logger = logging.getLogger('appdynamics.proxy')
    level = logging.DEBUG if debug else logging.INFO
    pass

我的脚本为 log4j2.xml 和 proxy.py 创建环境变量

update_appdynamics_log_level.sh

#!/bin/sh

# Check if PYENV_ROOT is not set
if [ -z "$PYENV_ROOT" ]; then
    # If PYENV_ROOT is not set, then set it to the default value
    export PYENV_ROOT="/usr/local/lib"
    echo "PYENV_ROOT was not set. Setting it to default: $PYENV_ROOT"
else
    echo "PYENV_ROOT is already set to: $PYENV_ROOT"
fi

echo "=========================== log4j2 - appdynamics_bindeps module ========================="

# Find the appdynamics_bindeps directory
APP_APPD_BINDEPS_DIR=$(find "$PYENV_ROOT" -type d -name "appdynamics_bindeps" -print -quit)

if [ -z "$APP_APPD_BINDEPS_DIR" ]; then
  echo "Error: appdynamics_bindeps directory not found."
  exit 1
fi

echo "Found appdynamics_bindeps directory at $APP_APPD_BINDEPS_DIR"

# Find the log4j2.xml file within the appdynamics_bindeps directory
APP_LOG4J2_FILE=$(find "$APP_APPD_BINDEPS_DIR" -type f -name "log4j2.xml" -print -quit)

if [ -z "$APP_LOG4J2_FILE" ]; then
  echo "Error: log4j2.xml file not found within the appdynamics_bindeps directory."
  exit 1
fi

echo "Found log4j2.xml file at $APP_LOG4J2_FILE"

# Modify the log level in the log4j2.xml file
echo "Modifying log level in log4j2.xml file"
sed -i 's/level="info"/level="${env:APP_APPD_LOG4J2_LOG_LEVEL:-info}"/g' "$APP_LOG4J2_FILE"

echo "log4j2.xml file modified successfully."

echo "=========================== watchdog - appdynamics module ==============================="

# Find the appdynamics directory
APP_APPD_DIR=$(find "$PYENV_ROOT" -type d -name "appdynamics" -print -quit)

if [ -z "$APP_APPD_DIR" ]; then
  echo "Error: appdynamics directory not found."
  exit 1
fi

echo "Found appdynamics directory at $APP_APPD_DIR"

# Find the proxy.py file within the appdynamics directory
APP_PROXY_PY_FILE=$(find "$APP_APPD_DIR" -type f -name "proxy.py" -print -quit)

if [ -z "$APP_PROXY_PY_FILE" ]; then
  echo "Error: proxy.py file not found within the appdynamics directory."
  exit 1
fi

echo "Found proxy.py file at $APP_PROXY_PY_FILE"

# Modify the log level in the proxy.py file
echo "Modifying log level in proxy.py file"
sed -i 's/logging.DEBUG if debug else logging.INFO/os.getenv("APP_APPD_WATCHDOG_LOG_LEVEL", "info").upper()/g' "$APP_PROXY_PY_FILE"


echo "proxy.py file modified successfully."

Dockerfile

使用 FastAPI 运行 pyagent 的 Dockerfile 并运行此脚本

# Use a specific version of the python image
FROM python:3.9

# Set the working directory in the container
WORKDIR /app

# First, copy only the requirements file and install dependencies to leverage Docker cache
COPY requirements.txt ./
RUN python3 -m pip install --no-cache-dir -r requirements.txt

# Now copy the rest of the application to the container
COPY . .

# Make the update_log4j2.sh and update_watchdog.sh scripts executable and run them
RUN chmod +x update_appdynamics_log_level.sh && \
    ./update_appdynamics_log_level.sh 

# Set environment variables
ENV APP_APPD_LOG4J2_LOG_LEVEL="warn" \
    APP_APPD_WATCHDOG_LOG_LEVEL="warn"

EXPOSE 8000

# Command to run the FastAPI application with pyagent
CMD ["pyagent", "run", "uvicorn", "main:app", "--proxy-headers", "--host","0.0.0.0", "--port","8000"]

脚本更改的文件

log4j2.xml

<Loggers>
    <!-- Modify each <AsyncLogger> level as needed -->
    <!-- Exemple -->
        <AsyncLogger name="com.singularity" level="${env:APP_APPD_LOG4J2_LOG_LEVEL:-info}" additivity="false">
            <AppenderRef ref="Default"/>
            <AppenderRef ref="RESTAppender"/>
            <AppenderRef ref="Console"/>
        </AsyncLogger>
</Loggers>

代理.py

def configure_proxy_logger(debug):
    logger = logging.getLogger('appdynamics.proxy')
    level = os.getenv("APP_APPD_WATCHDOG_LOG_LEVEL", "info").upper()
    pass

def configure_watchdog_logger(debug):
    logger = logging.getLogger('appdynamics.proxy')
    level = os.getenv("APP_APPD_WATCHDOG_LOG_LEVEL", "info").upper()
    pass

警告

请注意,这些路径和方法可能会根据您的 AppDynamics 版本和环境设置而有所不同。在进行更改之前务必备份文件,并注意 AppDynamics 的更新可能会覆盖您的自定义设置。

我希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.