2014-06-16 8 views
7

Ich habe das audit-logging Plugin in meiner Anwendung installiert. Die Grails-Version ist 2.1.1 und die Plugin-Version ist 1.0.1.Doppel-Datensätze in Grails mit Audit-Logging-Plugin eingefügt

In meiner Config.groovy Klasse habe ich diese hinzugefügt

auditLog { 
    verbose = true // verbosely log all changed values to db 
    logIds = true // log db-ids of associated objects. 
    // Note: if you change next 2 properties, you must update your database schema! 
    tablename = 'audit_logs' // table name for audit logs. 
    transactional = false 
    actorClosure = { request, session -> 
     org.apache.shiro.SecurityUtils.getSubject()?.getPrincipal() 
    } 

und in meiner Domain-Klasse habe ich hinzugefügt diese

class Survey { 
    static auditable = true 
    static final int NO_RUNNING_SURVERY = 0 
    static final int RUNNING_SURVERY = 1 

    static final int CALL_NO_Record_SURVEY = 0 
    static final int CALL_Record_SURVEY = 1 

    static final int REALTIME_SURVEY = 0 
    static final int HISTORICAL_SURVEY = 1 
    static final int STANDARD_SURVERY = 2 

    String name 
    String description 
    int status 
} 

wenn ich hinzufügen, löschen und einige etwas zu aktualisieren. In meiner Tabelle audit_logs wurde eine doppelte Aufzeichnung für eine Operation eingefügt, z.B. Wenn ich den Statuswert von meinem Controller-Klasse

def stopSurvey(Long id) { 
     def survey = Survey.findById(params['stop']) 
     survey.status = Survey.NO_RUNNING_SURVERY 


     redirect(action: "list") 
    } 

es fügt zwei Datensätze pro Anruf ändern.

+2

Ich testete das gleiche ohne die 'actorClosure' (nicht Shiro) und ich sehe dieses Verhalten nicht. Können Sie eine Beispielanwendung in github teilen, in der das Problem repliziert wird (mithilfe von Shiro)? Ich bemerke, dass Sie eine benutzerdefinierte Kennung im Controller verwendet haben, die ich nirgendwo in der Domänenklasse sehen kann. – dmahapatro

Antwort

1

Habe dieses Verhalten auch hier nicht gesehen. Dieses Plugin in vielen Projekten verwenden. Kannst du bitte verbose = false setzen und nochmal testen? Wenn das Problem dann auch auftritt, bedeutet dies, dass die Ereignisse nicht nur einmal ausgelöst werden.

Eine kleine Testapp wäre toll.

BTW: Wir verwenden Spock-Tests in der Testanwendung des Plugins-Projekts (Audit-Test), um zu prüfen, wie viele Ereignisse in der Tabelle audit_log gespeichert sind. Daher vermute ich einen Randfall oder ein spezifisches Problem in Ihrer App.

+1

Ich habe ausführlich = falsch getan, aber nichts ist passiert. :(. Wenn ich Debugger und mark Pause Zeiger in einer der Plugin-Funktion getActor(). Diese Funktion Aufruf dreimal pro Anfrage. Ich sehe kein Problem in meiner Anwendung, anstatt diese. –

+0

Follow-Up Kommentare auf JIRA-Ticket GPAUDITLOGGING-64 – Bertl

2

@Bertl

ich das Problem gefunden haben, glaube ich, ist das Problem in Plugin. Meine Anwendung verwendet drei Datenbanken, eine ist die Hauptdatenbank und die anderen zwei sind für andere Zwecke. Meine Datenbank ist wie folgt.

dataSource.driverClassName = net.sourceforge.jtds.jdbcx.JtdsDataSource 
dataSource.dbCreate = update 
dataSource.url = jdbc:jtds:sqlserver://localhost:1433/test 
dataSource.username = test 
dataSource.password = 123 

       #TEST1 
dataSource_TEST1.driverClassName = net.sourceforge.jtds.jdbcx.JtdsDataSource 
dataSource_TEST1.readOnly = true 
dataSource_TEST1.url = jdbc:jtds:sqlserver://xxx.xxx.xxx.xxx:1433/test1 
dataSource_TEST1.username = test1 
dataSource_TEST1.password = 123 


#     TEST2 
dataSource_TEST2.driverClassName = net.sourceforge.jtds.jdbcx.JtdsDataSource 
dataSource_TEST2.readOnly = true 
dataSource_TEST2.url = jdbc:jtds:sqlserver://xxx.xxx.xxxx.xxx:1433/test2 
dataSource_TEST2.username = test2 
dataSource_TEST2.password = 123 

Wenn ich nur die test Datenquelle verwenden und andere dataSources entfernen, fügt sie einen Datensatz. Wenn ich zwei Datenquellen verwende, dann füge ich zwei reocrd in audit logging Tabelle ein. Genau wie wenn ich die drei Datenquellen verwende, dann füge ich drei Datensätze in die Audit-Protokollierung ein. Ich brauche alle drei Datenbanken, aber es schafft das Problem. Was sollte ich jetzt tun?