[go] log 패키지를 활용한 로깅과 동시에 이메일 전송

Go 언어로 개발을 진행하다 보면 로깅은 필수적입니다. 로깅을 통해 애플리케이션의 상태를 모니터링하고, 에러를 신속하게 파악하는 데 도움이 됩니다. go 언어에서는 표준 라이브러리에서 제공하는 log 패키지를 활용하여 간단히 로깅을 구현할 수 있습니다. 또한, 이메일을 통한 알림 기능 또한 추가하고 싶을 때에는, log 패키지에 이메일을 전송하는 기능을 확장하여 구현할 수 있습니다.

로깅 구현하기

먼저, 간단한 예제를 통해 log 패키지를 사용하여 파일에 로그를 기록해보겠습니다. 아래와 같이 코드를 작성합니다.

package main

import (
	"log"
	"os"
)

func main() {
	file, err := os.OpenFile("app.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	log.SetOutput(file)
	log.Println("Logging to a file!")
}

위 코드에서는 os.OpenFile 함수를 사용하여 app.log 파일을 열고, log.SetOutput 함수를 사용하여 log 패키지의 출력을 해당 파일로 지정합니다. 그 후 log.Println 함수를 사용하여 로그를 기록합니다.

로깅과 동시에 이메일 전송하기

이제 log 패키지를 이용하여 로깅과 동시에 이메일을 전송하는 기능을 구현해보겠습니다. 이를 위해 log 패키지를 확장하여 이메일을 전송하는 함수를 추가할 수 있습니다. 다음은 이를 구현한 예제 코드입니다.

package main

import (
	"log"
	"net/smtp"
	"os"
)

func main() {
	file, err := os.OpenFile("app.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	log.SetOutput(file)
	log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)

	log.Println("Logging to a file!")

	// 이메일 전송
	sendEmail("recipient@example.com", "Error occurred", "An error occurred in the application.")
}

func sendEmail(recipient, subject, body string) {
	from := "sender@example.com"
	password := "password"
	msg := "From: " + from + "\n" +
		"To: " + recipient + "\n" +
		"Subject: " + subject + "\n\n" +
		body

	err := smtp.SendMail("smtp.example.com:25",
		smtp.PlainAuth("", from, password, "smtp.example.com"),
		from, []string{recipient}, []byte(msg))
	if err != nil {
		log.Fatal(err)
	}
	log.Println("Email sent successfully!")
}

위 코드에서는 sendEmail 함수를 추가하여 이메일을 전송하는 기능을 구현했습니다. log.Println 함수를 사용하여 로깅과 동시에 이메일 전송이 일어납니다. 또한, net/smtp 패키지를 사용하여 이메일을 전송했습니다.

이제 위의 예제 코드를 활용하여 로깅과 동시에 이메일 전송하는 기능을 구현해보시기 바랍니다.

결론

이번 포스트에서는 go 언어에서의 로깅과 동시에 이메일 전송에 대해 알아보았습니다. 로깅은 애플리케이션의 상태를 감시하고 에러를 신속하게 파악하는 데 도움을 주며, 이메일 전송은 신속한 대응이 필요한 상황에서 유용하게 사용될 수 있습니다. log 패키지를 통해 이 두 가지 기능을 효과적으로 구현할 수 있으니, 필요에 따라 활용해보시기 바랍니다.