.\"
.\" cupsd-logs man page for CUPS.
.\"
-.\" Copyright 2007-2014 by Apple Inc.
+.\" Copyright 2007-2017 by Apple Inc.
.\" Copyright 1997-2006 by Easy Software Products.
.\"
-.\" Licensed under Apache License v2.0. See the file "LICENSE" for more information.
+.\" Licensed under Apache License v2.0. See the file "LICENSE" for more
+.\" information.
.\"
-.TH cupsd-logs 5 "CUPS" "11 June 2014" "Apple Inc."
+.TH cupsd-logs 5 "CUPS" "8 November 2017" "Apple Inc."
.SH NAME
cupsd\-logs \- cupsd log files (access_log, error_log, and page_log)
.SH DESCRIPTION
The \fImessage\fR field contains a free-form textual message.
Messages from job filters are prefixed with "[Job NNN]" where "NNN" is the job ID.
.SS PAGE LOG FILE FORMAT
-The \fIpage_log\fR file lists each page or group of pages that are sent to a printer.
+The \fIpage_log\fR file lists the total number of pages (sheets) that are printed.
By default, each line contains the following information:
.nf
- \fIprinter user job-id date-time page-number num-copies job-billing
- job-originating-host-name job-name media sides\fR
-
- \fIprinter user job-id date-time \fBtotal \fInum-impressions job-billing
+ \fIprinter user job-id date-time \fBtotal \fInum-sheets job-billing
job-originating-host-name job-name media sides\fR
.fi
-For example the entries for a two page job called "myjob" might look like:
+For example the entry for a two page job called "myjob" might look like:
.nf
- DeskJet root 1 [20/May/1999:19:21:05 +0000] 1 1 acme-123
- localhost myjob na_letter_8.5x11in one-sided
- DeskJet root 1 [20/May/1999:19:21:05 +0000] 2 1 acme-123
- localhost myjob na_letter_8.5x11in one-sided
-
DeskJet root 1 [20/May/1999:19:21:06 +0000] total 2 acme-123
localhost myjob na_letter_8.5x11in one-sided
The \fIdate-time\fR field contains the date and time of when the page started printing.
The format of this field is identical to the data-time field in the \fIaccess_log\fR file.
.LP
-The \fIpage-number\fR and \fInum-copies\fR fields contain the page number and number of copies being printed of that page.
-For printers that cannot produce copies on their own, the num-copies field will always be 1.
-.LP
-Lines containing the keyword "total" have a \fInum-impressions\fR field instead which provides the total number of impressions (sides) that have been printed on for the job.
+The \fInum-sheets\fR field provides the total number of pages (sheets) that have been printed on for the job.
.LP
The \fIjob-billing\fR field contains a copy of the job-billing or job-account-id attributes provided with the IPP Create-Job or Print-Job requests or "-" if neither was provided.
.LP
if (!job->impressions)
job->impressions = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-impressions-completed", 0);
+ if (!job->sheets)
+ job->sheets = ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-media-sheets-completed", 0);
if (!job->priority)
{
cupsdStatBufDelete(job->status_buffer);
job->status_buffer = NULL;
+ /*
+ * Log the final impression (page) count...
+ */
+
+ snprintf(buffer, sizeof(buffer), "total %d", ippGetInteger(job->impressions, 0));
+ cupsdLogPage(job, buffer);
+
/*
* Process the exit status...
*/
update_job(cupsd_job_t *job) /* I - Job to check */
{
int i; /* Looping var */
- int copies; /* Number of copies printed */
char message[CUPSD_SB_BUFFER_SIZE],
/* Message text */
*ptr; /* Pointer update... */
if (loglevel == CUPSD_LOG_PAGE)
{
+ int impressions = ippGetInteger(job->impressions, 0);
+ /* Number of impressions printed */
+ int delta; /* Number of impressions added */
+
/*
* Page message; send the message to the page_log file and update the
* job sheet count...
cupsdLogJob(job, CUPSD_LOG_DEBUG, "PAGE: %s", message);
- if (job->impressions)
+ if (!_cups_strncasecmp(message, "total ", 6))
{
- if (!_cups_strncasecmp(message, "total ", 6))
- {
- /*
- * Got a total count of pages from a backend or filter...
- */
+ /*
+ * Got a total count of pages from a backend or filter...
+ */
+
+ int total = atoi(message + 6); /* Total impressions */
- copies = atoi(message + 6);
- copies -= ippGetInteger(job->impressions, 0); /* Just track the delta */
+ if (total > impressions)
+ {
+ delta = total - impressions;
+ impressions = total;
}
- else if (!sscanf(message, "%*d%d", &copies))
+ else
+ delta = 0;
+ }
+ else
+ {
+ /*
+ * Add the number of copies to the impression count...
+ */
+
+ int copies; /* Number of copies */
+
+ if (!sscanf(message, "%*d%d", &copies) || copies <= 0)
copies = 1;
- ippSetInteger(job->attrs, &job->impressions, 0, ippGetInteger(job->impressions, 0) + copies);
- job->dirty = 1;
- cupsdMarkDirty(CUPSD_DIRTY_JOBS);
+ delta = copies;
+ impressions += copies;
}
+ if (job->impressions)
+ ippSetInteger(job->attrs, &job->impressions, 0, impressions);
+
if (job->sheets)
{
- if (!_cups_strncasecmp(message, "total ", 6))
- {
- /*
- * Got a total count of pages from a backend or filter...
- */
-
- copies = atoi(message + 6);
- copies -= ippGetInteger(job->sheets, 0); /* Just track the delta */
- }
- else if (!sscanf(message, "%*d%d", &copies))
- copies = 1;
+ const char *sides = ippGetString(ippFindAttribute(job->attrs, "sides", IPP_TAG_KEYWORD), 0, NULL);
- ippSetInteger(job->attrs, &job->sheets, 0, ippGetInteger(job->sheets, 0) + copies);
- job->dirty = 1;
- cupsdMarkDirty(CUPSD_DIRTY_JOBS);
+ if (sides && strcmp(sides, "one-sided"))
+ ippSetInteger(job->attrs, &job->sheets, 0, impressions / 2);
+ else
+ ippSetInteger(job->attrs, &job->sheets, 0, impressions);
- if (job->printer->page_limit)
- cupsdUpdateQuota(job->printer, job->username, copies, 0);
+ cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job, "Printed %d page(s).", ippGetInteger(job->sheets, 0));
}
- cupsdLogPage(job, message);
+ job->dirty = 1;
+ cupsdMarkDirty(CUPSD_DIRTY_JOBS);
- if (job->sheets)
- cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job, "Printed %d page(s).", ippGetInteger(job->sheets, 0));
+ if (job->printer->page_limit)
+ cupsdUpdateQuota(job->printer, job->username, delta, 0);
}
else if (loglevel == CUPSD_LOG_JOBSTATE)
{