見出し画像

TWLogAIAN:リモートLinuxサーバーのログをscpで直接読み込みできた

昨日は遅くまでオリンピックのスピードスケートを観ていたので今朝は6時まで寝てしまいました。
3日も休みがあったのでログ分析ツールの開発が進みました。syslogやアクセスログの表示に対応できたので実際のLinuxサーバーのログを分析したくなりました。LinuxサーバーからTWLogAIANが動作するPCにファイルを転送して読み込むことはできますが、ちょっと面倒です。リモートのLinuxサーバーから直接読み込む方法を考えました。scpを使えばできそうなので使えそうなGO言語のパッケージを探したところ良いものを見つけました。

試してにテストプログラムを作ってみました。

package main

import (
	"context"
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"path"
	"time"

	"github.com/viant/afs/scp"
)

func main() {
	kpath := path.Join(os.Getenv("HOME"), ".ssh", "id_rsa")
	auth := scp.NewKeyAuth(kpath, "root", "")
	log.Println(auth.Username())
	provider := scp.NewAuthProvider(auth, nil)
	config, err := provider.ClientConfig()
	if err != nil {
		log.Fatal(err)
	}

	service, err := scp.NewStorager("192.168.1.6:22", time.Duration(time.Second), config)
	if err != nil {
		log.Fatal(err)
	}
	location := "/var/log/syslog"
	ctx := context.Background()
	reader, err := service.Open(ctx, location)
	if err != nil {
		log.Fatal(err)
	}
	data, err := ioutil.ReadAll(reader)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("data: %s\n", data)

	has, _ := service.Exists(ctx, location)
	fmt.Printf("%v %v\n", location, has)

	files, err := service.List(ctx, "/var/log")
	if err != nil {
		log.Fatal(err)
	}
	for _, file := range files {
		fmt.Printf("file: %v\n", file.Name())
	}
}

うまく動きました。使えそうです。
組み込んでましたが、Linuxサーバー上のログファイルは古くなるとgzip形式で圧縮されたファイルになっています。これも直接読み込みたいという野望が芽生えました。これもGO言語標準の

を使えば簡単に対応できました。
設定を

SCPの設定

のようにすると、192.168.1.6のLinuxサーバーの/var/logディレクトリからファイル名のパターンがsyslog*のログファイルを直接読み込んでインデックス作成できました。

SCPによるLinuxサーバーのログ読み込み

検索もできます。

SCPで転送したログの検索

かなり嬉しい! この開発は、

です。
gz形式の圧縮ファイルに対応できたので、ZIPやtar.gz形式のアーカイブファイルにも対応したくなってきました。調査するログはZIPやtar.gz形式でもらうことが多いので作ると便利だと思っています。
対応する方法を考え始めましたが、今朝は時間切れです。

明日に続く


いいなと思ったら応援しよう!

twsnmp
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。