mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-08-28 11:31:16 +00:00
virlog: Introduce virLogFindOutput
Outputs are a bit trickier than filters, since the user(config)-specified set of outputs can contain duplicates. That would lead to logging the same message twice. For compatibility reasons, we cannot just error out and forbid the daemon to start if we find duplicate outputs which do not make sense. Instead, we could silently take into account only the last occurrence of the duplicate output and remove all the previous ones, so that the logger will not try to use them when it is looping over all of its registered outputs. Signed-off-by: Erik Skultety <eskultet@redhat.com>
This commit is contained in:
parent
435200cab4
commit
b5004b09f5
@ -1874,6 +1874,7 @@ virLogDefineOutput;
|
||||
virLogFilterFree;
|
||||
virLogFilterListFree;
|
||||
virLogFilterNew;
|
||||
virLogFindOutput;
|
||||
virLogGetDefaultPriority;
|
||||
virLogGetFilters;
|
||||
virLogGetNbFilters;
|
||||
|
@ -1649,3 +1649,35 @@ virLogFilterNew(const char *match,
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* virLogFindOutput:
|
||||
* @outputs: a list of outputs where to look for the output of type @dest
|
||||
* @noutputs: number of elements in @outputs
|
||||
* @dest: destination type of an output
|
||||
* @opaque: opaque data to the method (only filename at the moment)
|
||||
*
|
||||
* Looks for an output of destination type @dest in the source list @outputs.
|
||||
* If such an output exists, index of the object in the list is returned.
|
||||
* In case of the destination being of type FILE also a comparison of the
|
||||
* output's filename with @opaque is performed first.
|
||||
*
|
||||
* Returns the index of the object in the list or -1 if no object matching the
|
||||
* specified @dest type and/or @opaque data one was found.
|
||||
*/
|
||||
int
|
||||
virLogFindOutput(virLogOutputPtr *outputs, size_t noutputs,
|
||||
virLogDestination dest, const void *opaque)
|
||||
{
|
||||
size_t i;
|
||||
const char *name = opaque;
|
||||
|
||||
for (i = 0; i < noutputs; i++) {
|
||||
if (dest == outputs[i]->dest &&
|
||||
(STREQ_NULLABLE(outputs[i]->name, name)))
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
@ -235,5 +235,7 @@ virLogOutputPtr virLogOutputNew(virLogOutputFunc f,
|
||||
virLogFilterPtr virLogFilterNew(const char *match,
|
||||
virLogPriority priority,
|
||||
unsigned int flags) ATTRIBUTE_NONNULL(1);
|
||||
int virLogFindOutput(virLogOutputPtr *outputs, size_t noutputs,
|
||||
virLogDestination dest, const void *opaque);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user