Oracle リスナーが接続エラーを起こしたとき、真っ先に確認すべきなのがリスナーのログファイルです。しかし「ログがどこにあるか分からない」「ログが大きくなりすぎて切り詰めたい」という悩みを持つ方は多いです。本記事では Oracle リスナーログの場所、確認方法、ローテーション(切り詰め)、読み方まで体系的に解説します。
- リスナーログ(alert/log.xml・listener.log)のデフォルトパス
- lsnrctl status でログの場所を確認する方法
- ADR(Automatic Diagnostic Repository)のディレクトリ構造
- ログが肥大化したときの切り詰め方法
- ログから接続エラーの原因を読み取る方法
- ログレベルの変更・ログ無効化の方法
リスナーの設定ファイル(listener.ora)の場所については listener.ora の場所・デフォルトパス完全ガイド で解説しています。ログの場所と合わせて確認しておきましょう。
リスナーログファイルの種類
Oracle 11g 以降、リスナーログは ADR(Automatic Diagnostic Repository)に格納されます。ログファイルは2種類あります。
| ファイル | 形式 | 用途 |
|---|---|---|
alert/log.xml |
XML | 構造化ログ。ADR の主要ログ(Oracle 11g 以降) |
trace/listener.log |
テキスト | 従来形式のログ。grep で検索しやすい |
trace/listener.log が便利XML 形式の
log.xml は ADR コマンド(adrci)で閲覧する想定です。テキスト形式の listener.log は grep・tail などで手軽に調査できるため、接続エラーのトラブルシューティングには trace 配下を参照するのが一般的です。
リスナーログのデフォルトパス
Linux / Unix の場合
# ADR のデフォルトベースパス $ORACLE_BASE/diag/tnslsnr/<ホスト名>/<リスナー名>/ # 具体例(ホスト名: db01, リスナー名: listener) $ORACLE_BASE/diag/tnslsnr/db01/listener/ # 主要なログファイル $ORACLE_BASE/diag/tnslsnr/db01/listener/alert/log.xml ← XML ログ $ORACLE_BASE/diag/tnslsnr/db01/listener/trace/listener.log ← テキストログ # ORACLE_BASE の確認 echo $ORACLE_BASE # 例: /u01/app/oracle # 典型的なフルパス /u01/app/oracle/diag/tnslsnr/db01/listener/trace/listener.log
Windows の場合
rem ADR のデフォルトベースパス %ORACLE_BASE%\diag\tnslsnr\<ホスト名>\<リスナー名>\ rem 具体例(ホスト名: WIN-DB01, リスナー名: listener) C:\app\oracle\diag\tnslsnr\WIN-DB01\listener\ rem 主要なログファイル C:\app\oracle\diag\tnslsnr\WIN-DB01\listener\alert\log.xml C:\app\oracle\diag\tnslsnr\WIN-DB01\listener\trace\listener.log
ORACLE_BASE はすべての Oracle 製品の親ディレクトリです(例: /u01/app/oracle)。ORACLE_HOME はその下の特定バージョンのバイナリが入るディレクトリです(例: /u01/app/oracle/product/19.0.0/dbhome_1)。ログは ORACLE_BASE/diag/ 配下に格納されます。
lsnrctl status でログの場所を確認する
最も確実な方法は lsnrctl status の出力からログパスを確認することです。
$ lsnrctl status LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 14-MAR-2026 09:00:00 ... Listener Parameter File /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/db01/listener/alert/log.xml ...
Listener Log File 行に表示されているのは alert/log.xml のパスです。trace/listener.log は同じディレクトリの trace/ 配下にあります。
# lsnrctl status からログディレクトリを自動取得
LOG_XML=$(lsnrctl status | grep "Listener Log File" | awk '{print $NF}')
LOG_DIR=$(dirname $(dirname $LOG_XML))
echo "Log directory: $LOG_DIR"
# テキストログのパスを構築
LISTENER_LOG="$LOG_DIR/trace/listener.log"
echo "Text log: $LISTENER_LOG"
リスナーログをシステムから検索する
# ORACLE_BASE 配下から listener.log を検索 find $ORACLE_BASE/diag/tnslsnr -name "listener.log" 2>/dev/null # ホスト名が分からない場合も含めて検索 find $ORACLE_BASE -name "listener.log" 2>/dev/null # log.xml も含めて検索 find $ORACLE_BASE/diag/tnslsnr -name "log.xml" 2>/dev/null # リスナー名が LISTENER 以外の場合はディレクトリ一覧で確認 ls -la $ORACLE_BASE/diag/tnslsnr/$(hostname -s)/
ADR ディレクトリ構造
Oracle 11g 以降の ADR ディレクトリ構造を理解しておくと、ログを探しやすくなります。
$ORACLE_BASE/diag/tnslsnr/<ホスト名>/<リスナー名>/ ├── alert/ │ └── log.xml ← XML 形式の構造化ログ(主ログ) ├── trace/ │ ├── listener.log ← テキスト形式ログ(grep 検索向き) │ └── *.trc ← トレースファイル(詳細診断用) ├── incident/ ← インシデント情報 ├── cdump/ ← コアダンプ └── metadata/ ← ADR メタデータ
リスナーログをリアルタイムで確認する
tail で末尾を監視
# リアルタイムでログを監視(接続テスト時などに有効) tail -f $ORACLE_BASE/diag/tnslsnr/$(hostname -s)/listener/trace/listener.log # 直近 100 行を表示 tail -100 $ORACLE_BASE/diag/tnslsnr/$(hostname -s)/listener/trace/listener.log # エラーのみ抽出 grep -i "error\|TNS-\|ORA-" $ORACLE_BASE/diag/tnslsnr/$(hostname -s)/listener/trace/listener.log | tail -50
adrci で XML ログを確認
# adrci を起動 adrci # ADR ホームを設定(リスナー用) adrci> set homepath diag/tnslsnr/<ホスト名>/listener # 直近のアラートログを表示 adrci> show alert -tail 50 # エラーのみ表示 adrci> show alert -p "message_text like '%TNS-%'" # インシデント一覧 adrci> show incident adrci> exit
ログの読み方:接続エラーの原因を特定する
典型的なログエントリの形式
# listener.log の典型的な形式 # タイムスタンプ イベント種別 詳細 14-MAR-2026 09:00:00 * (CONNECT_DATA=(SID=ORCL)(CID=(PROGRAM=sqlplus)...) * (ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.10)(PORT=52345)) * establish * ORCL * 0 # 末尾の数字の意味 # 0 = 接続成功 # 12514 = TNS: リスナーが現在サービスを認識していない # 12505 = TNS: リスナーが SID を認識していない # 12519 = TNS: リスナーが接続ハンドラを見つけられない # 12537 = TNS: 接続がクローズされました
よく見るエラーパターンと対処
# エラーコード 12514: サービスが登録されていない grep "12514" $ORACLE_BASE/diag/tnslsnr/$(hostname -s)/listener/trace/listener.log | tail -10 # 対処: DB を起動して ALTER SYSTEM REGISTER; を実行 # エラーコード 12505: SID が間違っている grep "12505" $ORACLE_BASE/diag/tnslsnr/$(hostname -s)/listener/trace/listener.log | tail -10 # 対処: tnsnames.ora の SID/SERVICE_NAME を確認 # TNS-01190: 権限エラー grep "TNS-01190" $ORACLE_BASE/diag/tnslsnr/$(hostname -s)/listener/trace/listener.log | tail -10 # 対処: oracle ユーザーで lsnrctl を実行 # 接続元 IP アドレスを確認(不審な接続の調査) grep "establish" $ORACLE_BASE/diag/tnslsnr/$(hostname -s)/listener/trace/listener.log | grep -v "* 0$" | tail -20
# 接続成功数(末尾が " * 0")
grep "establish" /path/to/listener.log | grep " \* 0$" | wc -l
# 接続失敗数(末尾が 0 以外)
grep "establish" /path/to/listener.log | grep -v " \* 0$" | wc -l
# エラーコード別の件数
grep "establish" /path/to/listener.log | grep -v " \* 0$" | awk '{print $NF}' | sort | uniq -c | sort -rn
ログが肥大化したときの切り詰め(ローテーション)
listener.log は自動ローテーションされないため、長期運用すると GB 単位に肥大化することがあります。
方法1: lsnrctl でログを一時停止してリネーム
# ログの書き込みを一時停止(リスナーは停止しない)
lsnrctl set log_status off
# ログファイルをリネーム(バックアップ)
LOG_FILE=$ORACLE_BASE/diag/tnslsnr/$(hostname -s)/listener/trace/listener.log
mv $LOG_FILE ${LOG_FILE}.$(date +%Y%m%d)
# ログ書き込みを再開(新しいファイルが自動作成される)
lsnrctl set log_status on
# 確認
ls -lh $ORACLE_BASE/diag/tnslsnr/$(hostname -s)/listener/trace/
方法2: logrotate で自動ローテーション(Linux)
# /etc/logrotate.d/oracle-listener を作成
cat > /etc/logrotate.d/oracle-listener << 'EOF'
/u01/app/oracle/diag/tnslsnr/*/listener/trace/listener.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
sharedscripts
postrotate
su - oracle -c "lsnrctl set log_status off && lsnrctl set log_status on"
endscript
}
EOF
# 設定をテスト
logrotate -d /etc/logrotate.d/oracle-listener
方法3: adrci でログをパージ
# adrci でリスナーの ADR ホームに移動 adrci adrci> set homepath diag/tnslsnr/<ホスト名>/listener # 30 日以上前のデータをパージ(-age 30 は分単位の注意: 30*24*60=43200 分) adrci> purge -age 43200 -type alert adrci> purge -age 43200 -type trace # または短縮形 adrci> purge adrci> exit
リスナーが起動中に
rm listener.log や truncate を実行すると、ファイルハンドルが解放されず新しいログが書き込まれなくなることがあります。必ず lsnrctl set log_status off で書き込みを停止してからファイルを操作してください。
ログレベルの変更・ログ無効化
ログレベルの設定
# 現在のログ設定を確認 lsnrctl show log_status lsnrctl show log_directory lsnrctl show log_file # ログを無効化(トラブルシューティング中に一時的に使用) lsnrctl set log_status off # ログを再有効化 lsnrctl set log_status on # トレースレベルを設定(USER/ADMIN/SUPPORT/OFF) lsnrctl set trc_level ADMIN # トレースを無効化 lsnrctl set trc_level off
listener.ora でログ設定を永続化
# listener.ora に記載することで再起動後も設定が維持される
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = db01.example.com)(PORT = 1521))
)
)
# ログ設定
LOG_DIRECTORY_LISTENER = /u01/app/oracle/diag/tnslsnr/db01/listener/trace
LOG_FILE_LISTENER = listener.log
LOG_STATUS_LISTENER = ON
# トレース設定(通常は OFF。問題発生時のみ有効化)
TRACE_DIRECTORY_LISTENER = /u01/app/oracle/diag/tnslsnr/db01/listener/trace
TRACE_FILE_LISTENER = listener.trc
TRACE_LEVEL_LISTENER = OFF
ログディレクトリの権限確認
# ログディレクトリの権限確認 ls -la $ORACLE_BASE/diag/tnslsnr/ # oracle ユーザーが書き込めるか確認 ls -la $ORACLE_BASE/diag/tnslsnr/$(hostname -s)/listener/trace/ # 権限を修正(ログが書き込めない場合) chown -R oracle:dba $ORACLE_BASE/diag/tnslsnr/ chmod -R 755 $ORACLE_BASE/diag/tnslsnr/
よくある質問(FAQ)
lsnrctl status の Listener Log File 行で確認するのが最確実です。リスナーが停止中の場合は find コマンドで検索してください。
# リスナーが起動中の場合 lsnrctl status | grep "Log File" # リスナーが停止中の場合 find $ORACLE_BASE -name "listener.log" 2>/dev/null # ORACLE_BASE が未設定の場合 find /u01 -name "listener.log" 2>/dev/null
日常的なトラブルシューティングには trace/listener.log(テキスト形式)が便利です。grep や tail で簡単に検索できます。alert/log.xml は adrci ツールを使った高度な診断に使います。
# テキストログで素早く確認 tail -50 /path/to/trace/listener.log grep "TNS-\|ORA-" /path/to/trace/listener.log # XML ログは adrci で確認 adrci adrci> set homepath diag/tnslsnr/<ホスト名>/listener adrci> show alert -tail 50
リスナー名ごとに別のディレクトリにログが出力されます。
# リスナー名ごとのディレクトリ $ORACLE_BASE/diag/tnslsnr/<ホスト名>/listener/trace/listener.log # LISTENER $ORACLE_BASE/diag/tnslsnr/<ホスト名>/listener2/trace/listener2.log # LISTENER2 # 全リスナーのログを確認 ls -la $ORACLE_BASE/diag/tnslsnr/$(hostname -s)/
リスナーを停止せずにログを安全に切り詰める手順は以下の通りです。
# 1. ログ書き込みを一時停止 lsnrctl set log_status off # 2. ログをリネーム(削除はせずバックアップとして残す) mv $ORACLE_BASE/diag/tnslsnr/$(hostname -s)/listener/trace/listener.log \ $ORACLE_BASE/diag/tnslsnr/$(hostname -s)/listener/trace/listener.log.$(date +%Y%m%d) # 3. ログ書き込みを再開(新ファイルが自動作成される) lsnrctl set log_status on # 4. 確認 ls -lh $ORACLE_BASE/diag/tnslsnr/$(hostname -s)/listener/trace/
リスナーログには接続試行の失敗も記録されます。少数のエラーがあっても、その後の接続が成功していれば(末尾が * 0)一時的な問題である可能性が高いです。ただし同じエラーが繰り返されている場合は根本原因を調査してください。
接続エラーが頻発する場合は ORA-12560: TNS プロトコル・アダプタ・エラーの解決方法 も参照してください。
# 直近の接続状況を確認(成功=0, 失敗=それ以外)
grep "establish" /path/to/listener.log | tail -20 | awk '{print $NF}'
まとめ
| 項目 | パス・コマンド |
|---|---|
| テキストログ(Linux) | $ORACLE_BASE/diag/tnslsnr/<ホスト名>/listener/trace/listener.log |
| XML ログ(Linux) | $ORACLE_BASE/diag/tnslsnr/<ホスト名>/listener/alert/log.xml |
| ログパスを確認 | lsnrctl status | grep "Log File" |
| リアルタイム監視 | tail -f /path/to/listener.log |
| エラー抽出 | grep "TNS-\|ORA-" listener.log |
| ログ一時停止 | lsnrctl set log_status off |
| ログ再開 | lsnrctl set log_status on |
| adrci でパージ | adrci> purge -age 43200 -type trace |
リスナーログで接続エラーを確認したら、リスナーの確認方法完全ガイド(lsnrctl status・tnsping) でリスナーの状態を詳細に診断してください。設定ファイルの確認は リスナー設定完全解説(listener.ora・lsnrctl・tnsnames.ora) を、リスナーの起動・再起動は リスナーの起動方法(lsnrctl start・自動起動設定) を参照してください。