SAS Studio 에서 돌린 코드는 sas-compute-server 파드 안에서 실행되고 로그도 그 파드에 남는다.
kubectl -n <namespace> get pods -l 'sas.com/component=compute-server' --sort-by=.metadata.creationTimestamp
kubectl -n <namespace> logs <compute-server-pod> -c sas-compute-server
세션 파드는 세션이 끝나면 사라진다. 실패한 세션의 로그를 보려면 파드가 곧바로 지워지지 않게 TTL 을 늘려 둔다. sas-launcher 디플로이먼트의 환경변수로 조정한다.
kubectl -n <namespace> set env deploy/sas-launcher \
COMPUTE_JOB_TTL_SECONDS_AFTER_FINISHED=1800 \
COMPUTE_POD_TTL_SECONDS_AFTER_FINISHED=1800
문제를 잡은 뒤에는 환경변수를 되돌린다.
SAS 9.4 워크스페이스 서버에서 쓰던 매크로는 Viya 4 의 compute 세션에서 동작하지 않는다.
%log4sas();
%log4sas_logger("App.tk.s3", "level=trace");
%put >>> test <<<;
%put 은 찍히는데 TRACE 로그는 하나도 안 나온다면 매크로가 무시된 것이다. 세션 파드의 로깅은 기동 시점에 읽는 logconfig.xml 이 정하므로 실행 중에 레벨을 바꿀 수 없다.
로그 레벨을 바꾸려면 배포 자산에서 compute 서버의 logconfig.xml 을 site-config 로 복사해 고치고 다시 배포한다. 해당 값은 sas-compute-server-config-* ConfigMap 의 SAS_INIT_CONFIG_KEY_LOGCONFIG 가 가리키는 구성 키에 들어간다.
kubectl -n <namespace> get cm | grep sas-compute-server-config
kubectl -n <namespace> get cm <sas-compute-server-config-xxxx> -o yaml
logconfig.xml 에 RollingFileAppender 를 두고 공유 스토리지 경로를 지정하면 세션 로그를 파드 밖에 남길 수 있다.
<log4sas:appender class="RollingFileAppender" name="PgmRollingFile">
<param name="Append" value="false"/>
<param name="Unique" value="true"/>
<param name="ImmediateFlush" value="true"/>
<param name="Encoding" value="utf-8"/>
<rollingPolicy class="TimeBasedRollingPolicy">
<param name="FileNamePattern"
value="/nfs/saslog/compute/ComputeServer_%d_%S{hostname}_%S{pid}.pgm.log"/>
</rollingPolicy>
<layout>
<param name="ConversionPattern"
value="%d{yyyy-MM-dd HH:mm:ss Z} |PGM|%S{hostname}|%u|%S{jobid}| %m"/>
</layout>
</log4sas:appender>
<logger name="App.Program" additivity="false" immutability="true">
<level value="Info"/>
<appender-ref ref="PgmRollingFile"/>
</logger>
경로는 슬래시로 시작하는 절대경로여야 한다. 상대경로를 주면 일부 어펜더만 파일을 만들고 나머지는 조용히 실패한다.
없는 어펜더를 참조하면 기동 시 오류가 난다.
The root definition in the LOGCONFIGLOC XML configuration source refers
(appender-ref) to the non-existent Console appender
appender-ref 는 같은 파일 안에 정의된 어펜더 이름과 정확히 맞아야 한다.
파드 타임존을 KST 로 맞춰도 이 파일 로그의 시각만 어긋나는 경우가 있다. 원인은 포맷이다.
%d{LEMZone} 은 SAS 가 정의한 ISO 8601 형태 포맷으로 타임존 표시가 없어 UTC 인지 로컬인지 구분되지 않는다.
2025-03-28T08:40:34,927
포맷을 직접 지정하고 오프셋 토큰을 붙인다.
%d{yyyy-MM-dd HH:mm:ss Z} -> 2025-03-28 17:40:34 +0900
포맷 문자열 안에 타임존 이름을 넣는 방식은 통하지 않는다.
ERROR: The %d precision yyyy-MM-dd HH:mm:ss, contains the pattern character A which is unknown.
Layout >>%d{yyyy-MM-dd HH:mm:ss,Asia/Seoul} %-5p [%t] %u - %m<<