KB-2334 How to find logs in an Appian on Kubernetes installation
Purpose
In certain troubleshooting scenarios, it may be necessary to gather specific logs and configuration files for Appian Support. This article will help users find where the requested information inside their Appian on Kubernetes install.
For any feedback or issue related to the commands' utilization, please feel free to include in your support case.
Instructions
Based on the requested files, please ensure the following:
- The user is able to access the worker nodes.
- The commands should be run from outside the pods. There is no need to exec into a certain pod in order to run the commands.
- Replace
<namespace>,<pod-name>,<your_appian>, etc. with actual values from your environment while running the commands.
Note: Copying logs from Kubernetes pods, especially large files, may temporarily cause fluctuation to node performance. To minimize impact, consider running log collection during low-traffic periods and monitoring node resource usage while transferring large files.
Important Logs for Each Component
General Configuration Files:
Engines, Service Manager, Kafka and Zookeeper:
- Status of Service Manager, engines and messaging services
- Service Manager logs
- Engine logs
- Kafka logs
- Zookeeper logs
Appian Data Server (ADS):
Search Server:
Application Server:
RPA:
Performance Metrics:
General Configuration Files:
Note: The information equivalent to build.info, custom.properties, tomcatResources.xml, appian-topology.xml will all be included in the same command output. Only one copy of appian-cr.yaml needs to be uploaded to the support case.
kubectl -n <namespace> get appian <your_appian> -o yaml > appian-cr.yaml- Physical file in webapp pod’s
/usr/local/appian/ae/conf/
kubectl -n <namespace> get appian <your_appian> -o yaml > appian-cr.yaml- Physical file in webapp pod’s
/usr/local/appian/ae/conf/
- Get the list of secrets in your Appian:
kubectl -n <namespace> get secret kubectl -n <namespace> get secret passwords-properties -o yaml > passwords-properties.yaml
kubectl -n <namespace> get appian <your_appian> -o yaml > appian-cr.yaml- Physical file in webapp pod’s
/usr/local/appian/ae/conf/
kubectl -n <namespace> get appian <your_appian> -o yaml > appian-cr.yaml- Physical file in webapp pod’s
/usr/local/appian/ae/conf/
Engines, Service Manager, Kafka and Zookeeper:
kubectl -n <namespace> exec -it <any-engine-pod-name> -- /bin/bash -c "/usr/local/appian/ae/serviceManagerScriptWrapper.sh services/bin/status.sh -c" > service_manager_health.txt
kubectl -n <namespace> get pods -o name | grep 'service-manager' | while read pod; do pod_name=${pod#pod/}; kubectl -n <namespace> cp $pod_name:/usr/local/appian/ae/logs/service_manager.log ./$pod_name.log; done && tar -cf service_manager-$(date +%Y%m%d).tar *service-manager*.log && rm -r *service-manager*.log
kubectl -n my-appian-site get pods -o name | grep 'service-manager' | while read pod; do pod_name=${pod#pod/}; echo $pod_name; latest_db_log=$(kubectl -n my-appian-site exec "$pod_name" -- bash -c "ls -t /usr/local/appian/ae/logs/db_*.log 2>/dev/null | head -n1"); echo $latest_db_log; kubectl -n my-appian-site cp "$pod_name":/"$latest_db_log" ./logs/"$pod_name"_"$latest_log".log; done && tar -cf engine_logs-$(date +%Y%m%d).tar logs/ && rm -r logs/
kubectl -n <namespace> exec -it <kafka-pod-name> -- /bin/bash -c "cd /usr/local/appian/ae && tar -cvf kafka.tar kafka/logs"kubectl -n <namespace> cp <kafka-pod-name>:/usr/local/appian/ae/kafka.tar ./kafka-$(date +"%Y%m%d").tar
kubectl -n <namespace> exec -it <zookeeper-pod-name> -- /bin/bash -c "cd /usr/local/appian/ae && tar -cvf zookeeper.tar zookeeper/logs"kubectl -n <namespace> cp <zookeeper-pod-name>:/usr/local/appian/ae/zookeeper.tar ./zookeeper-$(date +"%Y%m%d").tar
Appian Data Service (ADS):
kubectl -n <namespace> exec -it <data-server-pod-name> -- /bin/bash -c "/usr/local/appian/ae/data-server/bin/health.sh" > data-server-health.txt
kubectl -n <namespace> exec -it <data-server-pod-name> -- /bin/bash -c "cd /usr/local/appian/ae/logs && find data-server -type f -mtime -3 | tar -cf data-server.tar --files-from=-"kubectl -n <namespace> cp <data-server-pod-name>:/usr/local/appian/ae/logs/data-server.tar data-server-$(date +"%Y%m%d").tar
Search Server:
kubectl -n <namespace> exec -it <search-server-pod-name> -- /bin/bash -c "curl localhost:9200/_cluster/health?pretty" > search-server-health.txt
kubectl -n <namespace> exec -it <search-server-pod-name> -- /bin/bash -c "cd /usr/local/appian/ae/logs && find search-server -type f -mtime -3 | tar -cf search-server.tar --files-from=-"kubectl -n <namespace> cp <search-server-pod-name>:/usr/local/appian/ae/logs/search-server.tar search-server-$(date +"%Y%m%d").tar
Application Server:
kubectl -n <namespace> exec -it <webapp-pod-name> -- /bin/bash -c "cd /usr/local/appian/ae && find logs/ -type f -name 'tomcat*' -mtime -3 | tar --transform='s|^logs/|tomcat-logs/|' -cf webapp.tar --files-from=-"
RPA:
kubectl -n <namespace> exec -it <rpa-pod-name> -- bash -c 'log_dir="/data/tomcat8/logs";catalina_log=$(ls -t $log_dir | grep "catalina" | head -1);localhost_log=$(ls -t $log_dir | grep "localhost\.[0-9]" | head -1);localhost_access=$(ls -t $log_dir | grep "localhost_access_log" | head -1);tar -cvf /tmp/rpa_logs.tar $log_dir/jidoka.log $log_dir/rtdo.log $log_dir/rpdo.log $log_dir/robotRDO.log $log_dir/$catalina_log $log_dir/$localhost_log $log_dir/$localhost_access'kubectl -n <namespace> cp <rpa-pod-name>:/tmp/rpa_logs.tar rpa-$(date +"%Y%m%d").tar
Performance Metrics:
kubectl -n <namespace> exec -it <webapp-pod-name> -- /bin/bash -c "cd /usr/local/appian/ae/logs && find perflogs -type f -mtime -1 | tar -cf perflogs.tar --files-from=-"kubectl -n <namespace> cp <webapp-pod-name>:/usr/local/appian/ae/perflogs.tar perflogs$(date +"%Y%m%d").tar
kubectl -n <namespace> exec -it <webapp-pod-name> -- /bin/bash -c "cd /usr/local/appian/ae/logs && find data-metrics-type f -mtime -1 | tar -cf data-metrics.tar --files-from=-"kubectl -n <namespace> cp <webapp-pod-name>:/usr/local/appian/ae/data-metrics.tar data-metrics-$(date +"%Y%m%d").tar
kubectl -n <namespace> cp <webapp-pod-name>:/usr/local/appian/ae/long-running-work-items.log long-running-work-items-$(date +"%Y%m%d").log
Affected Versions
This article applies to all versions of self-managed Appian on Kubernetes.
Last Reviewed: March 2025
