Add some preliminary logging capacity

This commit is contained in:
Dimitri Fontaine 2013-03-16 16:47:10 +01:00
parent c6c3f11ffe
commit 72c783f02f
5 changed files with 55 additions and 2 deletions

View File

@ -5,10 +5,21 @@
(defpackage #:pgloader.utils (defpackage #:pgloader.utils
(:use #:cl) (:use #:cl)
(:import-from #:cl-log
#:defcategory
#:log-manager
#:start-messenger
#:log-message
#:ring-messenger
#:text-file-messenger
#:formatted-message)
(:import-from #:pgloader.params (:import-from #:pgloader.params
#:*reject-path-root* #:*reject-path-root*
#:*log-filename*
#:*log-level*
#:*state*) #:*state*)
(:export #:report-header (:export #:log-message
#:report-header
#:report-table-name #:report-table-name
#:report-results #:report-results
#:report-footer #:report-footer
@ -37,6 +48,7 @@
#:*loader-kernel* #:*loader-kernel*
#:*state*) #:*state*)
(:import-from #:pgloader.utils (:import-from #:pgloader.utils
#:log-message
#:report-header #:report-header
#:report-table-name #:report-table-name
#:report-results #:report-results
@ -70,6 +82,7 @@
#:*myconn-pass* #:*myconn-pass*
#:*state*) #:*state*)
(:import-from #:pgloader.utils (:import-from #:pgloader.utils
#:log-message
#:report-header #:report-header
#:report-table-name #:report-table-name
#:report-results #:report-results
@ -101,6 +114,7 @@
#:*loader-kernel* #:*loader-kernel*
#:*state*) #:*state*)
(:import-from #:pgloader.utils (:import-from #:pgloader.utils
#:log-message
#:report-header #:report-header
#:report-table-name #:report-table-name
#:report-results #:report-results

View File

@ -7,6 +7,7 @@
(:use #:cl) (:use #:cl)
(:export #:*csv-path-root* (:export #:*csv-path-root*
#:*reject-path-root* #:*reject-path-root*
#:*log-filename*
#:*loader-kernel* #:*loader-kernel*
#:*myconn-host* #:*myconn-host*
#:*myconn-user* #:*myconn-user*
@ -26,6 +27,12 @@
(defparameter *reject-path-root* (defparameter *reject-path-root*
(make-pathname :directory "/tmp/pgloader/")) (make-pathname :directory "/tmp/pgloader/"))
(defparameter *log-filename*
(make-pathname :directory "/tmp/pgloader/" :name "pgloader" :type "log"))
(defparameter *log-level* :notice)
(setq *log-level* :debug)
;;; package nicknames are only defined later, in package.lisp ;;; package nicknames are only defined later, in package.lisp
(defparameter *loader-kernel* (lparallel:make-kernel 2) (defparameter *loader-kernel* (lparallel:make-kernel 2)
"lparallel kernel to use for loading data in parallel") "lparallel kernel to use for loading data in parallel")

View File

@ -5,7 +5,8 @@
:description "Load data into PostgreSQL" :description "Load data into PostgreSQL"
:author "Dimitri Fontaine <dimitri@2ndQuadrant.fr>" :author "Dimitri Fontaine <dimitri@2ndQuadrant.fr>"
:license "The PostgreSQL Licence" :license "The PostgreSQL Licence"
:depends-on (#:postmodern :depends-on (#:cl-log
#:postmodern
#:cl-postgres #:cl-postgres
#:simple-date #:simple-date
#:cl-mysql #:cl-mysql

View File

@ -281,12 +281,15 @@ Finally returns how many rows where read and processed."
"Fetch data from the QUEUE until we see :end-of-data. Update *state*" "Fetch data from the QUEUE until we see :end-of-data. Update *state*"
(when truncate (truncate-table dbname table-name)) (when truncate (truncate-table dbname table-name))
(log-message :debug "pgsql:copy-from-queue: ~a ~a" dbname table-name)
(let* ((conspec (remove :port (get-connection-string dbname)))) (let* ((conspec (remove :port (get-connection-string dbname))))
(loop (loop
for retval = for retval =
(let* ((stream (cl-postgres:open-db-writer conspec table-name nil)) (let* ((stream (cl-postgres:open-db-writer conspec table-name nil))
(*batch* nil) (*batch* nil)
(*batch-size* 0)) (*batch-size* 0))
(log-message :debug "pgsql:copy-from-queue: starting new batch")
(unwind-protect (unwind-protect
(let ((process-row-fn (let ((process-row-fn
(make-copy-and-batch-fn stream :date-columns date-columns))) (make-copy-and-batch-fn stream :date-columns date-columns)))
@ -295,6 +298,7 @@ Finally returns how many rows where read and processed."
;; in case of data-exception, split the batch and try again ;; in case of data-exception, split the batch and try again
(handler-case (handler-case
(progn (progn
(log-message :debug "pgsql:copy-from-queue: commit batch")
(cl-postgres:close-db-writer stream)) (cl-postgres:close-db-writer stream))
((or ((or
CL-POSTGRES-ERROR:UNIQUE-VIOLATION CL-POSTGRES-ERROR:UNIQUE-VIOLATION
@ -328,6 +332,8 @@ Finally returns how many rows where read and processed."
(dataq (lq:make-queue 4096)) (dataq (lq:make-queue 4096))
(*state* (if report (pgloader.utils:make-pgstate) *state*))) (*state* (if report (pgloader.utils:make-pgstate) *state*)))
(log-message :debug "pgsql:copy-from-file: ~a ~a ~a" dbname table-name filename)
(when report (when report
(pgstate-add-table *state* dbname table-name)) (pgstate-add-table *state* dbname table-name))
@ -422,12 +428,16 @@ Finally returns how many rows where read and processed."
(loop (loop
while (< processed-rows batch-size) while (< processed-rows batch-size)
do do
(log-message :debug "pgsql:retry-batch: splitting current batch")
(let* ((current-batch current-batch-pos) (let* ((current-batch current-batch-pos)
(current-batch-size (smaller-batch-size batch-size (current-batch-size (smaller-batch-size batch-size
processed-rows)) processed-rows))
(stream (stream
(cl-postgres:open-db-writer conspec table-name nil))) (cl-postgres:open-db-writer conspec table-name nil)))
(log-message :debug "pgsql:retry-batch: current-batch-size = ~d"
current-batch-size)
(unwind-protect (unwind-protect
(dotimes (i current-batch-size) (dotimes (i current-batch-size)
;; rows in that batch have already been processed ;; rows in that batch have already been processed

View File

@ -3,6 +3,27 @@
;;; ;;;
(in-package :pgloader.utils) (in-package :pgloader.utils)
;;;
;;; Logs
;;;
;;; First define the log categories
(defcategory :critical)
(defcategory :error (or :error :critical))
(defcategory :warning (or :warning :error))
(defcategory :notice (or :notice :warning))
(defcategory :info (or :info :notice))
(defcategory :debug (or :debug :info))
;; Now define the Logger
(setf (log-manager)
(make-instance 'log-manager :message-class 'formatted-message))
;; And a messenger to store our message into
(start-messenger 'text-file-messenger :filename *log-filename*)
;; Announce what just happened
(log-message :notice "Starting pgloader, log system is ready.")
;;; ;;;
;;; Timing Macro ;;; Timing Macro
;;; ;;;