| | |
| | | import java.io.FileOutputStream; |
| | | import java.io.IOException; |
| | | import java.io.OutputStreamWriter; |
| | | import java.util.ArrayList; |
| | | import java.util.Calendar; |
| | | import java.util.List; |
| | | import java.util.concurrent.CopyOnWriteArrayList; |
| | | |
| | | import org.forgerock.i18n.LocalizableMessage; |
| | | import org.forgerock.i18n.slf4j.LocalizedLogger; |
| | | import org.forgerock.opendj.config.server.ConfigChangeResult; |
| | | import org.forgerock.opendj.config.server.ConfigurationChangeListener; |
| | | import org.forgerock.opendj.server.config.server.SizeLimitLogRotationPolicyCfg; |
| | | import org.opends.server.api.DirectoryThread; |
| | | import org.opends.server.api.ServerShutdownListener; |
| | | import org.opends.server.core.DirectoryServer; |
| | | import org.forgerock.opendj.config.server.ConfigChangeResult; |
| | | import org.opends.server.types.DirectoryException; |
| | | import org.opends.server.types.FilePermission; |
| | | import org.opends.server.util.TimeThread; |
| | |
| | | |
| | | private static final String UTF8_ENCODING= "UTF-8"; |
| | | |
| | | private CopyOnWriteArrayList<RotationPolicy> rotationPolicies = new CopyOnWriteArrayList<>(); |
| | | private CopyOnWriteArrayList<RetentionPolicy> retentionPolicies = new CopyOnWriteArrayList<>(); |
| | | private final CopyOnWriteArrayList<RotationPolicy<?>> rotationPolicies = new CopyOnWriteArrayList<>(); |
| | | private final CopyOnWriteArrayList<RetentionPolicy<?>> retentionPolicies = new CopyOnWriteArrayList<>(); |
| | | |
| | | private FileNamingPolicy namingPolicy; |
| | | private FilePermission filePermissions; |
| | | private LogPublisherErrorHandler errorHandler; |
| | | /** TODO: Implement actions. */ |
| | | private ArrayList<ActionType> actions; |
| | | private final LogPublisherErrorHandler errorHandler; |
| | | |
| | | private String name; |
| | | private String encoding; |
| | | private final String name; |
| | | private final String encoding; |
| | | private int bufferSize; |
| | | private boolean autoFlush; |
| | | private boolean append; |
| | |
| | | private boolean stopRequested; |
| | | private long sizeLimit; |
| | | |
| | | private Thread rotaterThread; |
| | | private final Thread rotaterThread; |
| | | |
| | | private Calendar lastRotationTime = TimeThread.getCalendar(); |
| | | private Calendar lastCleanTime = TimeThread.getCalendar(); |
| | |
| | | * |
| | | * @param policy The rotation policy to add. |
| | | */ |
| | | public void addRotationPolicy(RotationPolicy policy) |
| | | public void addRotationPolicy(RotationPolicy<?> policy) |
| | | { |
| | | this.rotationPolicies.add(policy); |
| | | |
| | |
| | | * |
| | | * @param policy The retention policy to add. |
| | | */ |
| | | public void addRetentionPolicy(RetentionPolicy policy) |
| | | public void addRetentionPolicy(RetentionPolicy<?> policy) |
| | | { |
| | | this.retentionPolicies.add(policy); |
| | | } |
| | |
| | | /** Removes all the rotation policies currently enforced by this writer. */ |
| | | public void removeAllRotationPolicies() |
| | | { |
| | | for(RotationPolicy policy : rotationPolicies) |
| | | for (RotationPolicy<?> policy : rotationPolicies) |
| | | { |
| | | if(policy instanceof SizeBasedRotationPolicy) |
| | | { |
| | |
| | | long newSizeLimit = Integer.MAX_VALUE; |
| | | |
| | | // Go through all current size rotation policies and get the lowest size setting. |
| | | for(RotationPolicy policy : rotationPolicies) |
| | | for (RotationPolicy<?> policy : rotationPolicies) |
| | | { |
| | | if(policy instanceof SizeBasedRotationPolicy) |
| | | { |
| | |
| | | private class RotaterThread extends DirectoryThread |
| | | { |
| | | MultifileTextWriter writer; |
| | | /** Create a new rotater thread. */ |
| | | |
| | | public RotaterThread(MultifileTextWriter writer) |
| | | { |
| | | super(name); |
| | |
| | | logger.traceException(e); |
| | | } |
| | | |
| | | for(RotationPolicy rotationPolicy : rotationPolicies) |
| | | for (RotationPolicy<?> rotationPolicy : rotationPolicies) |
| | | { |
| | | if(rotationPolicy.rotateFile(writer)) |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | for(RetentionPolicy retentionPolicy : retentionPolicies) |
| | | for (RetentionPolicy<?> retentionPolicy : retentionPolicies) |
| | | { |
| | | try |
| | | { |
| | |
| | | errorHandler.handleOpenError(currentFile, e); |
| | | } |
| | | |
| | | //RotationActionThread rotThread = |
| | | // new RotationActionThread(newFile, actions, configEntry); |
| | | //rotThread.start(); |
| | | |
| | | logger.trace("Log file %s rotated and renamed to %s", |
| | | currentFile, newFile); |
| | | logger.trace("Log file %s rotated and renamed to %s", currentFile, newFile); |
| | | totalFilesRotated++; |
| | | lastRotationTime = TimeThread.getCalendar(); |
| | | } |
| | | |
| | | /** |
| | | * This method sets the actions that need to be executed after rotation. |
| | | * |
| | | * @param actions An array of actions that need to be executed on rotation. |
| | | */ |
| | | public void setPostRotationActions(ArrayList<ActionType> actions) |
| | | { |
| | | this.actions = actions; |
| | | } |
| | | |
| | | @Override |
| | | public long getBytesWritten() |
| | | { |