Postgre: Windows 版でクエリーログの分析をしたい

# はじめに
Power BI の Direct Query で発行される Postgres の Query を確認したかったのでその際に調べたことの記録

# 環境
- Postgres 14.0.1
    - Document は 13 用の日本語へのリンク 
- pgAdmin 4.6.5
- Windows 10

# SQL Server のように View にあるんじゃないか？
カタログのビューで以下やってみたが、無かった。
→　[統計情報だった](https://www.postgresql.jp/document/13/html/monitoring-stats.html#PG-STAT-ACTIVITY-VIEW)

現在も動いてるクエリーなんかはこれで確認して殺したり、とか出来るみたい。
```sql:pg_stat_activity
SELECT query
	FROM pg_catalog.pg_stat_activity;
```

# ログを吐き出せば良さそう
## 設定ファイルはどこ？ 
C:\Program Files\PostgreSQL\14\data\postgresql.conf

## 変更する設定は？
最低限は以下だけかな、と

> log_min_duration_statement -1

これを 0 へ

> log_min_duration_statement (integer)
文の実行に少なくとも指定したミリ秒数かかった場合、それぞれの文の実行に要した時間をログに記録します。 0に設定すれば、すべての文の実行時間が出力されます。 -1（デフォルト）は、文実行時間の記録を無効にします。 例えば、250msと設定した場合、250msもしくはそれ以上長くかかった全てのSQL文がログとして残ります。 このパラメータを有効にすることにより、アプリケーションで最適化されていない問い合わせを追跡するのが便利になります。 スーパーユーザのみこの設定を変更できます。

## 設定詳細
When to log や What to log で設定調整しつつ

[いつログを取得するか](https://www.postgresql.jp/document/13/html/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-WHEN)
[何をログに](https://www.postgresql.jp/document/13/html/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-WHAT)


## 出力フォルダは？
C:\Program Files\PostgreSQL\14\data\log

> #log_directory = 'log'			# directory where log files are written,
					# can be absolute or relative to PGDATA

## ローテーション出来る？
多分、以下

> #log_rotation_age = 1d			# Automatic rotation of logfiles will
					# happen after that time.  0 disables.

# ログが文字化けするよ？
## 原因
- UTF8 と ShiftJIS 混在になってる。頑張ればそれぞれで見ることは可能 :laughing: 

## 対処
― Install 時に、Localを "C" ( none select ) にする

or 

- postgresql.conf で以下修正。今回はこっち

```config:locals
lc_messages = 'C'			# locale for system error message
					# strings
lc_monetary = 'C'			# locale for monetary formatting
lc_numeric = 'C'			# locale for number formatting
lc_time = 'C'				# locale for time formatting
```
![Install時のロケールを"C" へ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/09866cdc-4407-0f6b-4e07-1a751ddcef1b.png)

## 説明詳細
https://lets.postgresql.jp/documents/tutorial/windows/1

https://lets.postgresql.jp/documents/technical/text-processing/2


# Parse、Bind、Execute ってログが記録されるけど何？

[拡張問い合わせ](https://www.postgresql.jp/document/13/html/protocol-flow.html#PROTOCOL-FLOW-EXT-QUERY) によるもので、全部出ちゃうって話。
詳細に見たくなくて Execute だけってしたかったんだけど・・log 設定では見つからない・・

# Log の CSV 形式出力

CSV log にすれば フィルターかけやすいかな、ということで
以下みたいにして、"csvlog" を追加すれば、再起動後に出力される

> log_destination = 'stderr, csvlog'		# Valid values are combinations of
					# stderr, csvlog, syslog, and eventlog,
					# depending on platform.  csvlog
					# requires logging_collector to be on.

## CSV の確認したい場合は、LinqPad がおすすめ
で、あとは、"execute" が含まれるものを、column 1: 登録時刻で降順にすれば欲しいものが一覧化出来て確認が楽になった、と

https://qiita.com/baku2san/items/8bf2006e1325f6203382


## CSV には出力されてるのに、最新が見えないんだけど
キャッシュが効いてるので、用途によってはキャッシュを殺す
![2022-02-25_11h08_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645569/b0a318a2-aefa-3f41-689b-768a8999e5d4.png)


# PostgreDB 再起動
設定の反映が必要な時に

1. Win + R
1. services.msc 起動
1. Postgre Server探して再起動

# あとがき
Postgres の Document 翻訳作業は以下で 13.x が実施中ということなので、英語得意で何か Contribute したい人には向いてる気もする。
ちょっと気になるけど、まだやりたいことというか、やらなければってことが多すぎて・・手が出ない :turtle: 

https://github.com/pgsql-jp/jpug-doc