Advertisement
Guest User

Untitled

a guest
Oct 31st, 2015
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 7.61 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "database/sql"
  5.     "fmt"
  6.     _ "github.com/go-sql-driver/mysql" //можно подключить любую sql базу данных
  7.     "log"
  8.     "net"
  9.     "net/smtp"
  10.     "strings"
  11.     "time"
  12. )
  13.  
  14. var DB *sql.DB
  15.  
  16. //Создаём счётчики
  17. var i_debug int = 1
  18. var i_info int = 1
  19. var i_warn int = 1
  20. var i_error int = 1
  21.  
  22. //переменные которые выполняют роль кеша.
  23. var cacheDebug string
  24. var cacheInfo string
  25. var cacheWarn string
  26. var cacheError string
  27.  
  28. //Здесь просто конектимся к бд
  29. func init() {
  30.     db, err := sql.Open("mysql", "root:parsh888@/logs_service")
  31.     if err != nil {
  32.         log.Fatal(err)
  33.     }
  34.     DB = db
  35. }
  36. func main() {
  37.     //вешаем сервер на 2000 порт
  38.     l, err := net.Listen("tcp", ":2000")
  39.     if err != nil {
  40.         log.Fatal(err)
  41.     }
  42.     defer l.Close()
  43.     for {
  44.         //В вечном цикле "слушаем" 2000 порт. Ждём подключения
  45.         conn, err := l.Accept()
  46.         if err != nil {
  47.             log.Fatal(err)
  48.         }
  49.         //К нам кто то подключился. Откроем для него свою GO рутину
  50.         go func(c net.Conn) {
  51.  
  52.             //создаём буфер для получения данных из вне.
  53.             buf := make([]byte, 1024)
  54.  
  55.             //открываем ещё один вечный цикл для того чтобы можно было получить n количество сообщений,
  56.             // а не одно
  57.             for {
  58.                 //Полученную информацию пишем в буфер
  59.                 c.Read(buf)
  60.  
  61.                 //Конвертируем данные из буфера в строку и эти данные разбиваем по символам |][|
  62.                 //это нужно что бы отличить команду от логируемой записи.
  63.                 /*
  64.                     Пример работы с лог сервером
  65.                         telnet localhost 2000
  66.                         Debug|][|это тестовая лог запись
  67.                     Запись попадёт в бд как только мы обратимся к методу
  68.                         UnloadTheCacheDB|][|null
  69.                     или вы напишете 300 Debug логов. В бд уйдёт сразу пачка.
  70.                 */
  71.                 result := strings.Split(string(buf), "|][|")
  72.                 //отправляем команды в swith (команда это лово перед |][|). Если команда существует
  73.                 //то сервер её обработает. Если нет то произойдёт вызов swith default и соединение
  74.                 //закроется
  75.                 switch result[0] {
  76.  
  77.                 case "Debug":
  78.                     if i_debug <= 300 { //Как только соберётся 300 лог записей отработает это условие
  79.  
  80.                         //этот кусок запроса последний в пачке. Прикрутил else из - за того что если за
  81.                         // последними данными будет кома то бд скажет об ошибке sql синтаксиса
  82.                         cacheDebug = cacheDebug + "('" + time.Now().String() + "','" + result[1] + "')"
  83.                         //Передаём наш кеш в новую GO рутину
  84.                         go DebugDB(cacheDebug)
  85.                         //сбрасываем счётчик
  86.                         i_debug = 0
  87.                         //очищаем кеш
  88.                         cacheDebug = " "
  89.                     } else {
  90.                         //если эти данные не последние то за ними нужна кома.
  91.                         cacheDebug = cacheDebug + "('" + time.Now().String() + "','" + result[1] + "'),"
  92.                     }
  93.                     //обновляем счётчик
  94.                     i_debug++
  95.  
  96.                 //Дальше код до case Fatal аналогичен.
  97.                 case "Info":
  98.                     if i_info <= 150 {
  99.                         cacheInfo = cacheInfo + "('" + time.Now().String() + "','" + result[1] + "')"
  100.                         go InfoDB(cacheInfo)
  101.                         i_info = 0
  102.                         cacheInfo = " "
  103.                     } else {
  104.                         cacheInfo = cacheInfo + "('" + time.Now().String() + "','" + result[1] + "'),"
  105.                     }
  106.                     i_info++
  107.  
  108.                 case "Warn":
  109.                     if i_warn <= 50 {
  110.                         cacheWarn = cacheWarn + "('" + time.Now().String() + "','" + result[1] + "')"
  111.                         go WarnDB(cacheWarn)
  112.  
  113.                         i_warn = 0
  114.                         cacheWarn = " "
  115.                     } else {
  116.                         cacheWarn = cacheWarn + "('" + time.Now().String() + "','" + result[1] + "'),"
  117.                     }
  118.                     i_warn++
  119.  
  120.                 case "Error":
  121.                     if i_error == 25 {
  122.                         cacheError = cacheError + "('" + time.Now().String() + "','" + result[1] + "')"
  123.                         go ErrorDB(cacheError)
  124.  
  125.                         i_error = 0
  126.                         cacheError = " "
  127.                         cacheError = cacheError + "('" + time.Now().String() + "','" + result[1] + "'),"
  128.                     }
  129.                     i_error++
  130.  
  131.                 //фатальная ошибка. Буфера нет. Сразу пишется в бд и отправляется уведомления на email
  132.                 case "Fatal":
  133.                     go FatalDB(result[1])
  134.  
  135.                 //Отправляем все записи  в бд не дождавшись пока наполняться буферы
  136.                 case "UnloadTheCacheDB":
  137.                     //Отправляем буферы в новые go рутины
  138.                     go DebugDB(cacheDebug)
  139.                     go InfoDB(cacheInfo)
  140.                     go WarnDB(cacheWarn)
  141.                     go ErrorDB(cacheError)
  142.  
  143.                     //чистим кешы
  144.                     cacheDebug = " "
  145.                     cacheInfo = " "
  146.                     cacheWarn = " "
  147.                     cacheError = " "
  148.                     //сбрасываем щётчики
  149.                     i_debug = 0
  150.                     i_info = 0
  151.                     i_warn = 0
  152.                     i_error = 0
  153.                     log.Print("Бд успешно обновлена, а кеш очищен")
  154.                 //этот метод безвозвратно удаляет логи из буфера.
  155.                 case "ClearCache":
  156.                     cacheDebug = " "
  157.                     cacheInfo = " "
  158.                     cacheWarn = " "
  159.                     cacheError = " "
  160.                     i_debug = 0
  161.                     i_info = 0
  162.                     i_warn = 0
  163.                     i_error = 0
  164.                     log.Print("Кеш успешно очистили")
  165.                 //метода нету. Закрываем соеденение
  166.                 default:
  167.                     log.Print("case Default\n")
  168.                     c.Close()
  169.                     //если убрать return то log.Print будет работать в бесконечном цикле
  170.                     return
  171.                 }
  172.  
  173.             }
  174.         }(conn)
  175.     }
  176. }
  177.  
  178. //просто пише в таблицы.
  179. func DebugDB(cache string) {
  180.     DB.Exec("INSERT INTO debug (date,message) VALUES " + cache)
  181.     return
  182. }
  183. func InfoDB(cache string) {
  184.     DB.Exec("INSERT INTO info (date,message) VALUES " + cache)
  185.     return
  186. }
  187. func WarnDB(cache string) {
  188.     DB.Exec("INSERT INTO warn (date,message) VALUES " + cache)
  189.     return
  190. }
  191. func ErrorDB(cache string) {
  192.     DB.Exec("INSERT INTO error (date,message) VALUES " + cache)
  193.     return
  194. }
  195.  
  196. //А тут пишем в бд и отправляем email уведомление
  197. func FatalDB(message string) {
  198.     //пишем в бд
  199.     DB.Exec("INSERT INTO fatal (date,message) VALUES (?,?)", time.Now().String(), message)
  200.     ////Уведомление
  201.     conf := map[string]string{
  202.         "username": "portalnet.tk@gmail.com", //логин от любой почты на gamail
  203.         "password": "parsh888",               //ну и пароль
  204.         "host":     "smtp.gmail.com",
  205.         "port":     "587",
  206.     }
  207.     //масив с адресатами
  208.     to := []string{
  209.         "v.grabko99@gmail.com",
  210.         "id324237193-6fce7d7ef@vkmessenger.com",
  211.     }
  212.     //вызиваем отправку
  213.     SendMail(conf, to, "Fatal Errors", message)
  214.     return
  215.  
  216. }
  217. func SendMail(conf map[string]string, to []string, subject string, msg string) {
  218.     auth := smtp.PlainAuth(
  219.         "",
  220.         conf["username"],
  221.         conf["password"],
  222.         conf["host"],
  223.     )
  224.     address := fmt.Sprintf("%v:%v", conf["host"], conf["port"])
  225.     body := []byte("Subject: " + subject + "\r\n\r\n" + msg)
  226.     err := smtp.SendMail(
  227.         address,
  228.         auth,
  229.         conf["username"],
  230.         to,
  231.         body,
  232.     )
  233.     if err != nil {
  234.         log.Fatal(err)
  235.     }
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement