【Oracle】リスナーログの場所と確認方法|listener.log・log.xml・切り詰め・読み方完全ガイド

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_HOME の違い
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
ログを直接削除・truncate しないこと
リスナーが起動中に rm listener.logtruncate を実行すると、ファイルハンドルが解放されず新しいログが書き込まれなくなることがあります。必ず 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)

Q listener.log が見当たりません。どこにありますか?
A

lsnrctl statusListener 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
Q listener.log と log.xml の違いは?どちらを見ればよいですか?
A

日常的なトラブルシューティングには trace/listener.log(テキスト形式)が便利です。greptail で簡単に検索できます。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
Q リスナーが複数ある場合、ログはどこに出力されますか?
A

リスナー名ごとに別のディレクトリにログが出力されます。

# リスナー名ごとのディレクトリ
$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)/
Q listener.log が数 GB になってしまいました。安全に削除するには?
A

リスナーを停止せずにログを安全に切り詰める手順は以下の通りです。

# 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/
Q ログにエラーがあるが接続できている。問題ありますか?
A

リスナーログには接続試行の失敗も記録されます。少数のエラーがあっても、その後の接続が成功していれば(末尾が * 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・自動起動設定) を参照してください。